Solid IntersectSub(Solid csg, bool retesselate, bool canonicalize) { Tree a = new Tree(Polygons); Tree b = new Tree(csg.Polygons); a.Invert(); b.ClipTo(a); b.Invert(); a.ClipTo(b); b.ClipTo(a); a.AddPolygons(b.AllPolygons()); a.Invert(); Solid result = Solid.FromPolygons(a.AllPolygons()); if (retesselate) { result = result.Retesselated(); } if (canonicalize) { result = result.Canonicalized(); } return(result); }
Solid UnionSub(Solid csg, bool retesselate, bool canonicalize) { if (!MayOverlap(csg)) { return(UnionForNonIntersecting(csg)); } else { Tree a = new Tree(Polygons); Tree b = new Tree(csg.Polygons); a.ClipTo(b, false); b.ClipTo(a); b.Invert(); b.ClipTo(a); b.Invert(); Polygon[] ArrayPolygonA = a.AllPolygons().ToArray(); Polygon[] ArrayPolygonB = b.AllPolygons().ToArray(); Polygon[] ArrayNewPolygon = new Polygon[ArrayPolygonA.Length + ArrayPolygonB.Length]; Array.Copy(ArrayPolygonA, 0, ArrayNewPolygon, 0, ArrayPolygonA.Length); Array.Copy(ArrayPolygonB, 0, ArrayNewPolygon, ArrayPolygonA.Length, ArrayPolygonB.Length); Solid result = Solid.FromPolygons(ArrayNewPolygon.ToList()); if (retesselate) { result = result.Retesselated(); } if (canonicalize) { result = result.Canonicalized(); } return(result); } }