Menu

#25 Incorrect result of clip case with ExPolygons solutions (v5.0.2.3)

1.0
open
nobody
None
2017-11-08
2017-11-08
cuixiping
No

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 ?

1 Attachments

Discussion


Log in to post a comment.