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())); }
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); }