public static List <Polyline> BooleanDifference(List <Curve> curves, List <Curve> cutters, double dist, double scale = 1e10) { //http://www.angusj.com/delphi/clipper/documentation/Docs/Overview/Example.htm // A = NGonsCore.Geometry.Polyline3D.Boolean(ClipType.ctIntersection, polylines, cutters, Plane.WorldXY, 1 / 1e10, true); List <Polyline> output = new List <Polyline>(); List <Polyline> cutters_ = CurvesToPolylines(cutters, dist); List <Polyline> polylines_ = CurvesToPolylines(curves, dist); Plane cutterPlane = new Plane(); Transform xform = Transform.PlaneToPlane(cutterPlane, Plane.WorldXY); NGonsCore.Clipper642.Clipper clipper = new NGonsCore.Clipper642.Clipper(); var cutter = PolylineToIntPoints(cutters_, scale); clipper.AddPaths(cutter, PolyType.ptClip, true); var input = PolylineToIntPoints(polylines_, scale); clipper.AddPaths(input, PolyType.ptSubject, true); List <List <IntPoint> > solution = new List <List <IntPoint> >(); clipper.Execute(ClipType.ctDifference, solution); List <Polyline> polys = IntPointToPolylines(solution, scale); output.AddRange(polys); return(output); }
public static Tuple <List <Polyline>, List <Polyline>, List <Polyline> > BooleanIntersection(List <Curve> curves, List <Curve> cutters, double dist, double scale = 1e10) { //http://www.angusj.com/delphi/clipper/documentation/Docs/Overview/Example.htm // A = NGonsCore.Geometry.Polyline3D.Boolean(ClipType.ctIntersection, polylines, cutters, Plane.WorldXY, 1 / 1e10, true); //this.Component.Message = "Boolean Intersection"; List <Polyline> output = new List <Polyline>(); List <Polyline> cutters_ = CurvesToPolylines(cutters, dist); List <Polyline> innerPolygons = new List <Polyline>(); List <Polyline> edgePolygons = new List <Polyline>(); List <Polyline> edgePolygons_ = new List <Polyline>(); for (int j = 0; j < curves.Count; j++) { Polyline polyline = CurveToPolyline(curves[j]); NGonsCore.Clipper642.Clipper clipper = new NGonsCore.Clipper642.Clipper(); var cutter = PolylineToIntPoints(cutters_, scale); clipper.AddPaths(cutter, PolyType.ptClip, true); var input = PolylineToIntPoint(polyline, scale); clipper.AddPath(input, PolyType.ptSubject, true); /* * foreach(IntPoint intpt in input){ * NGonsCore.Clipper642.Clipper.PointInPolygon(intpt, cutter); * } */ List <List <IntPoint> > solution = new List <List <IntPoint> >(); clipper.Execute(ClipType.ctIntersection, solution); solution = NGonsCore.Clipper642.Clipper.SimplifyPolygons(solution, PolyFillType.pftEvenOdd); List <Polyline> polys = IntPointToPolylines(solution, scale); output.AddRange(polys); if (polys.Count > 0) { if (polys.Count == polyline.Count) { edgePolygons.AddRange(polys); edgePolygons_.Add(polyline); } else { if (Math.Abs((polys[0].Length - polyline.Length)) < 0.01 && polys[0].Count == polyline.Count) { innerPolygons.Add(polys[0]); //innerPolygons.Add(j); } else { edgePolygons.AddRange(polys); edgePolygons_.Add(polyline); // edgePolygons.Add(j); } } } } //innerPolylines = innerPolygons; //edgePolylinesCut = edgePolygons; //edgePolylines = edgePolygons_; // A = cutters_; return(new Tuple <List <Polyline>, List <Polyline>, List <Polyline> >(innerPolygons, edgePolygons, edgePolygons_)); }