Esempio n. 1
0
        /// <summary>
        /// Decompose the polygon into several smaller non-concave polygon.
        /// </summary>
        public static List <Vertices> ConvexPartition(Vertices vertices)
        {
            Debug.Assert(vertices.Count > 3);

            Polygon.Polygon poly = new Polygon.Polygon();

            foreach (Vector2 vertex in vertices)
            {
                poly.Points.Add(new TriangulationPoint(vertex.X, vertex.Y));
            }

            if (vertices.Holes != null)
            {
                foreach (Vertices holeVertices in vertices.Holes)
                {
                    Polygon.Polygon hole = new Polygon.Polygon();

                    foreach (Vector2 vertex in holeVertices)
                    {
                        hole.Points.Add(new TriangulationPoint(vertex.X, vertex.Y));
                    }

                    poly.AddHole(hole);
                }
            }

            DTSweepContext tcx = new DTSweepContext();

            tcx.PrepareTriangulation(poly);
            DTSweep.Triangulate(tcx);

            List <Vertices> results = new List <Vertices>();

            foreach (DelaunayTriangle triangle in poly.Triangles)
            {
                Vertices v = new Vertices();
                foreach (TriangulationPoint p in triangle.Points)
                {
                    v.Add(new Vector2((float)p.X, (float)p.Y));
                }
                results.Add(v);
            }

            return(results);
        }
        /// <summary>
        /// Decompose the polygon into several smaller non-concave polygon.
        /// </summary>
        public static List <Vertices> ConvexPartition(Vertices vertices)
        {
            Debug.Assert(vertices.Count > 3);

            var poly = new Polygon.Polygon();

            foreach (var vertex in vertices)
            {
                poly.Points.Add(new TriangulationPoint(vertex.x, vertex.y));
            }

            if (vertices.Holes != null)
            {
                foreach (var holeVertices in vertices.Holes)
                {
                    var hole = new Polygon.Polygon();

                    foreach (var vertex in holeVertices)
                    {
                        hole.Points.Add(new TriangulationPoint(vertex.x, vertex.y));
                    }

                    poly.AddHole(hole);
                }
            }

            var tcx = new DTSweepContext();

            tcx.PrepareTriangulation(poly);
            DTSweep.Triangulate(tcx);

            var results = new List <Vertices>();

            foreach (var triangle in poly.Triangles)
            {
                var v = new Vertices();
                foreach (var p in triangle.Points)
                {
                    v.Add(new Vector2(p.X, p.Y));
                }
                results.Add(v);
            }

            return(results);
        }