예제 #1
0
        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);
        }
예제 #2
0
        public static List <Polyline> Boolean(ClipType clipType, IEnumerable <Polyline> polyA, IEnumerable <Polyline> polyB,
                                              Plane pln, double tolerance, bool evenOddFilling)
        {
            NGonsCore.Clipper642.Clipper clipper = new NGonsCore.Clipper642.Clipper();
            PolyFillType polyfilltype            = PolyFillType.pftEvenOdd;

            if (!evenOddFilling)
            {
                polyfilltype = PolyFillType.pftNonZero;
            }

            foreach (Polyline plA in polyA)
            {
                clipper.AddPath(plA.ToPath2D(pln, tolerance), PolyType.ptSubject, plA.IsClosed);
            }

            foreach (Polyline plB in polyB)
            {
                clipper.AddPath(plB.ToPath2D(pln, tolerance), PolyType.ptClip, true);
            }

            PolyTree polytree = new PolyTree();

            clipper.Execute(clipType, polytree, polyfilltype, polyfilltype);

            List <Polyline> output = new List <Polyline>();

            // ReSharper disable once LoopCanBeConvertedToQuery
            foreach (PolyNode pn in polytree.Iterate())
            {
                if (pn.Contour.Count > 1)
                {
                    output.Add(pn.Contour.ToPolyline(pln, tolerance, !pn.IsOpen));
                }
            }

            return(output);
        }
예제 #3
0
        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_));
        }