modify(clip, type) { var [clipPositionX, clipPositionY] = [clip.positionX - clip.positionX % 25, clip.positionY - clip.positionY % 25]; var absoluteClipPoints = clip.points.map(([x, y]) => { return {X: x + clipPositionX - clip.options.center[0], Y: y + clipPositionY - clip.options.center[1]}; }); var absolutePoints = this.points.map(([x, y]) => { return {X: x + this.positionX, Y: y + this.positionY}; }); var clipper = new ClipperLib.Clipper(); clipper.AddPaths([absolutePoints], ClipperLib.PolyType.ptSubject, true); clipper.AddPaths([absoluteClipPoints], ClipperLib.PolyType.ptClip, true); var cliptype; switch (type) { case 'subtract': cliptype = ClipperLib.ClipType.ctDifference; break; case 'add': cliptype = ClipperLib.ClipType.ctUnion; break; } var polyfilltype = ClipperLib.PolyFillType.pftPositive; var result = new ClipperLib.Paths(); clipper.Execute(cliptype, result); var processedResult = result[0].map((point) => { return [point.X - this.positionX, point.Y - this.positionY]; }); this.points = processedResult; this.render(); }
function computeWalkableArea(object) { var cpr = new ClipperLib.Clipper(); var coords = object.geometry.coordinates; var perimeter = coords[0]; var subj_paths = [fromJsonToClipper(perimeter)]; var clip_paths = []; for (var i = 1; i < coords.length; i++) { var internal_hole = coords[i]; clip_paths.push(fromJsonToClipper(internal_hole)); } for (k in object.children) { var child = object.children[k]; if (child.geometry.type === 'Polygon') { clip_paths.push(fromJsonToClipper(child.getLocalCoordinates())); } } // console.log(subj_paths); //console.log(clip_paths); cpr.AddPaths(subj_paths, ClipperLib.PolyType.ptSubject, true); // true means closed path cpr.AddPaths(clip_paths, ClipperLib.PolyType.ptClip, true); var walkableArea = new ClipperLib.Paths(); var succeeded = cpr.Execute(ClipperLib.ClipType.ctDifference, walkableArea, ClipperLib.PolyFillType.pftNonZero, ClipperLib.PolyFillType.pftNonZero); walkableArea = walkableArea.map(fromClipperToJson); return walkableArea; }