Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            }
        }