示例#1
0
        public void FaceTriangulationTest()
        {
            Triangulation result = new Triangulation();

            foreach (var face in m_dcel.InnerFaces)
            {
                result.AddTriangulation(Triangulator.Triangulate(face));
            }
            var triangles = result.Triangles.ToList();

            Assert.AreEqual(8, triangles.Count);
            Assert.IsTrue(triangles.TrueForAll(t => t.IsClockwise()));
        }
示例#2
0
        public void AddTriangulationTest()
        {
            var tr  = new Triangle(v1, v2, v4);
            var tr2 = new Triangle();
            var T2  = new Triangulation(T.Triangles);
            var T3  = new Triangulation(new List <Triangle>()
            {
                tr, tr2
            });

            T2.AddTriangulation(T3);
            Assert.AreEqual(4, T2.Triangles.Count);
        }
        /// <summary>
        /// Triangulate a collection of dcel faces.
        /// </summary>
        /// <param name="faces"></param>
        /// <param name="setTwinPointers"> whether the triangulation should set twin pointers </param>
        /// <returns></returns>
        public static Triangulation Triangulate(IEnumerable <Face> faces, bool setTwinPointers = true)
        {
            var T = new Triangulation();

            foreach (var face in faces)
            {
                T.AddTriangulation(Triangulate(face, false));
            }

            if (setTwinPointers)
            {
                T.SetTwinPointers();
            }

            return(T);
        }
        /// <summary>
        /// Triangulates the polygon recursively.
        /// Finds the leftmost point and creates a triangle with that or splits polygon in two.
        /// </summary>
        /// <param name="vertices"></param>
        /// <returns></returns>
        private static Triangulation TriangulateRecursive(List <Vector2> vertices)
        {
            if (vertices.Count == 3)
            {
                return(new Triangulation(vertices));
            }

            var triangulation = new Triangulation();

            //Find leftmost vertex
            var leftVertex = LeftMost(vertices);
            var index      = vertices.IndexOf(leftVertex);
            var prevVertex = vertices[MathUtil.PositiveMod(index - 1, vertices.Count)];
            var nextVertex = vertices[MathUtil.PositiveMod(index + 1, vertices.Count)];

            //Create triangle with diagonal
            Debug.Assert(leftVertex != prevVertex && leftVertex != nextVertex && prevVertex != nextVertex);

            var triangle = new Triangle(prevVertex, leftVertex, nextVertex);

            //check for other vertices inside the candidate triangle
            var   baseline      = new Line(prevVertex, nextVertex);
            float distance      = -1f;
            int   diagonalIndex = -1;

            for (int i = 0; i < vertices.Count; i++)
            {
                var v = vertices[i];
                if (v != leftVertex && v != prevVertex && v != nextVertex &&
                    triangle.Contains(v))
                {
                    if (baseline.DistanceToPoint(v) > distance)
                    {
                        distance      = baseline.DistanceToPoint(v);
                        diagonalIndex = i;
                    }
                }
            }

            //Do Recursive call
            if (diagonalIndex == -1) //didn't change
            {
                if (!triangle.IsClockwise())
                {
                    // shouldnt happen but in case it does
                    // reverse triangle
                    triangle = new Triangle(triangle.P0, triangle.P2, triangle.P1);
                }

                triangulation.AddTriangle(triangle);
                vertices.Remove(leftVertex);
                triangulation.AddTriangulation(TriangulateRecursive(vertices));
            }
            else
            {
                var minIndex = Mathf.Min(index, diagonalIndex);
                var maxIndex = Mathf.Max(index, diagonalIndex);

                var poly1List = vertices.Skip(minIndex).Take(maxIndex - minIndex + 1).ToList();
                var poly2List = vertices.Skip(maxIndex).Concat(vertices.Take(minIndex + 1)).ToList();

                triangulation.AddTriangulation(TriangulateRecursive(poly1List));
                triangulation.AddTriangulation(TriangulateRecursive(poly2List));
            }

            return(triangulation);
        }