Incorrect result of clip case with ExPolygons solutions (v5.0.2.3)
Boolean operations and offsetting library in Javascript
Brought to you by:
timo23414
Clipper 5.0.2.3
Subject polygons:
[[0,0, 400,0, 400,300, 0,300]]
Clip polygons:
[
[30,30, 30,160, 60,160, 60,60, 330,60, 330,160, 360,160, 360,30],
[60,120, 60,220, 330,220, 330,120, 200,190],
[170,90, 170,120, 200,120, 200,90]
]
JS code:
function plainToPoly(arr) {
var re = [];
for (var i = 0; i < arr.length - 1; i+=2) {
re.push({X:arr[i], Y:arr[i+1]});
}
return re;
}
var subj_polys = [plainToPoly([0,0, 400,0, 400,300, 0,300])];
var clip_polys = [
plainToPoly([30,30, 30,160, 60,160, 60,60, 330,60, 330,160, 360,160, 360,30]),
plainToPoly([60,120, 60,220, 330,220, 330,120, 200,190]),
plainToPoly([170,90, 170,120, 200,120, 200,90])
];
var cpr = new ClipperLib.Clipper();
cpr.AddPolygons(subj_polys, ClipperLib.PolyType.ptSubject, true);
cpr.AddPolygons(clip_polys, ClipperLib.PolyType.ptClip, true);
var solutions = new ClipperLib.ExPolygons();
cpr.Execute(ClipperLib.ClipType.ctDifference, solutions, ClipperLib.PolyFillType.pftNonZero, ClipperLib.PolyFillType.pftNonZero);
console.log(solutions);
Outputs:
[
{
"outer":[{"X":0,"Y":300},{"X":0,"Y":0},{"X":400,"Y":0},{"X":400,"Y":300}],
"holes":[
[{"X":60,"Y":220},{"X":330,"Y":220},{"X":330,"Y":160},{"X":360,"Y":160},{"X":360,"Y":30},{"X":30,"Y":30},{"X":30,"Y":160},{"X":60,"Y":160}],
[{"X":170,"Y":120},{"X":200,"Y":120},{"X":200,"Y":90},{"X":170,"Y":90}]]
},
{
"outer":[{"X":200,"Y":190},{"X":60,"Y":120},{"X":60,"Y":60},{"X":330,"Y":60},{"X":330,"Y":120}],
"holes":[]
}
]
Expected outputs:
[
{
"outer":[{"X":0,"Y":300},{"X":0,"Y":0},{"X":400,"Y":0},{"X":400,"Y":300}],
"holes":[[{"X":60,"Y":220},{"X":330,"Y":220},{"X":330,"Y":160},{"X":360,"Y":160},{"X":360,"Y":30},{"X":30,"Y":30},{"X":30,"Y":160},{"X":60,"Y":160}]]
},
{
"outer":[{"X":200,"Y":190},{"X":60,"Y":120},{"X":60,"Y":60},{"X":330,"Y":60},{"X":330,"Y":120}],
"holes":[[{"X":170,"Y":120},{"X":200,"Y":120},{"X":200,"Y":90},{"X":170,"Y":90}]]
}
]
Using clipper v6.4.2.2 PolyTree and PolyTreeToExPolygons can get correct result.
Will this bug be fixed with clipper v5 ?