Exemplo n.º 1
0
        public Csgjs Union(Csgjs csg)
        {
            if (Polygons.Count == 0)
            {
                return(csg.Clone());
            }
            if (csg.Polygons.Count == 0)
            {
                return(Clone());
            }

            var a = new CsgNode(Clone().Polygons);
            var b = new CsgNode(csg.Clone().Polygons);

            a.ClipTo(b);
            b.ClipTo(a);
            b.Invert();
            b.ClipTo(a);
            b.Invert();
            a.Build(b.AllPolygons());
            return(FromPolygons(a.AllPolygons()));
        }
Exemplo n.º 2
0
            public void Build(List <CsgPolygon> polygons)
            {
                if (polygons.Count == 0)
                {
                    return;
                }

                if (Plane == null)
                {
                    // Don't randomly choose a split plane. Coherent results are important.
                    Plane = polygons[polygons.Count / 2].Plane.Clone();
                }
                var frontPolygons = new List <CsgPolygon>();
                var backPolygons  = new List <CsgPolygon>();

                for (int i = 0; i < polygons.Count; i++)
                {
                    Plane.SplitPolygon(polygons[i], Polygons, Polygons, frontPolygons, backPolygons);
                }

                if (frontPolygons.Count > 0)
                {
                    if (Front == null)
                    {
                        Front = new CsgNode();
                    }
                    Front.Build(frontPolygons);
                }
                if (backPolygons.Count > 0)
                {
                    if (Back == null)
                    {
                        Back = new CsgNode();
                    }
                    Back.Build(backPolygons);
                }
            }