protected void UpdateVertexReflexity(PartitionVertex v) { PartitionVertex v1 = null, v3 = null; v1 = v.previous; v3 = v.next; v.isConvex = !IsReflex(v1.p, v.p, v3.p); }
protected void UpdateVertexReflexity(PartitionVertex v) { PartitionVertex v1 = null, v3 = null; v1 = v.Previous; v3 = v.Next; v.IsConvex = !IsReflex(v1.P, v.P, v3.P); }
protected bool InCone(PartitionVertex v, TpplPoint p) { TpplPoint p1, p2, p3; p1 = v.Previous.P; p2 = v.P; p3 = v.Next.P; return(InCone(p1, p2, p3, p)); }
protected bool InCone(PartitionVertex v, TPPLPoint p) { TPPLPoint p1, p2, p3; p1 = v.previous.p; p2 = v.p; p3 = v.next.p; return(InCone(p1, p2, p3, p)); }
protected void UpdateVertex(PartitionVertex v, List <PartitionVertex> vertices) { int i; PartitionVertex v1 = null, v3 = null; TpplPoint vec1, vec3; v1 = v.Previous; v3 = v.Next; v.IsConvex = IsConvex(v1.P, v.P, v3.P); vec1 = Normalize(v1.P - v.P); vec3 = Normalize(v3.P - v.P); v.Angle = vec1.X * vec3.X + vec1.Y * vec3.Y; if (v.IsConvex) { v.IsEar = true; int numvertices = vertices.Count; for (i = 0; i < numvertices; i++) { if ((vertices[i].P.X == v.P.X) && (vertices[i].P.Y == v.P.Y)) { continue; } if ((vertices[i].P.X == v1.P.X) && (vertices[i].P.Y == v1.P.Y)) { continue; } if ((vertices[i].P.X == v3.P.X) && (vertices[i].P.Y == v3.P.Y)) { continue; } if (IsInside(v1.P, v.P, v3.P, vertices[i].P)) { v.IsEar = false; break; } } } else { v.IsEar = false; } }
protected void UpdateVertex(PartitionVertex v, List <PartitionVertex> vertices) { int i; PartitionVertex v1 = null, v3 = null; TPPLPoint vec1, vec3; v1 = v.previous; v3 = v.next; v.isConvex = IsConvex(v1.p, v.p, v3.p); vec1 = Normalize(v1.p - v.p); vec3 = Normalize(v3.p - v.p); v.angle = vec1.X * vec3.X + vec1.Y * vec3.Y; if (v.isConvex) { v.isEar = true; int numvertices = vertices.Count(); for (i = 0; i < numvertices; i++) { if ((vertices[i].p.X == v.p.X) && (vertices[i].p.Y == v.p.Y)) { continue; } if ((vertices[i].p.X == v1.p.X) && (vertices[i].p.Y == v1.p.Y)) { continue; } if ((vertices[i].p.X == v3.p.X) && (vertices[i].p.Y == v3.p.Y)) { continue; } if (IsInside(v1.p, v.p, v3.p, vertices[i].p)) { v.isEar = false; break; } } } else { v.isEar = false; } }
private static void UpdateVertex(PartitionVertex v, PartitionVertex[] vertices, int numvertices) { PartitionVertex v1 = v.previous; PartitionVertex v3 = v.next; v.isConvex = IsConvex(v1.p, v.p, v3.p); Vector2 vec1 = Normalize(v1.p - v.p); Vector2 vec3 = Normalize(v3.p - v.p); v.angle = vec1.x * vec3.x + vec1.y * vec3.y; if (v.isConvex) { v.isEar = true; for (int i = 0; i < numvertices; i++) { if ((vertices[i].p.x == v.p.x) && (vertices[i].p.y == v.p.y)) { continue; } if ((vertices[i].p.x == v1.p.x) && (vertices[i].p.y == v1.p.y)) { continue; } if ((vertices[i].p.x == v3.p.x) && (vertices[i].p.y == v3.p.y)) { continue; } if (IsInside(v1.p, v.p, v3.p, vertices[i].p)) { v.isEar = false; break; } } } else { v.isEar = false; } }
public int Triangulate_EC(TpplPoly poly, List <TpplPoly> triangles) { int numvertices; List <PartitionVertex> vertices = null; PartitionVertex ear = null; TpplPoly triangle = new TpplPoly(); int i, j; bool earfound; if (poly.Count < 3) { return(0); } if (poly.Count == 3) { triangles.Add(poly); return(1); } numvertices = poly.Count; vertices = new List <PartitionVertex>(numvertices); for (i = 0; i < numvertices; i++) { vertices.Add(new PartitionVertex()); } for (i = 0; i < numvertices; i++) { vertices[i].IsActive = true; vertices[i].P = poly[i]; if (i == (numvertices - 1)) { vertices[i].Next = vertices[0]; } else { vertices[i].Next = vertices[i + 1]; } if (i == 0) { vertices[i].Previous = vertices[numvertices - 1]; } else { vertices[i].Previous = vertices[i - 1]; } } for (i = 0; i < numvertices; i++) { UpdateVertex(vertices[i], vertices); } for (i = 0; i < numvertices - 3; i++) { earfound = false; //find the most extruded ear for (j = 0; j < numvertices; j++) { if (!vertices[j].IsActive) { continue; } if (!vertices[j].IsEar) { continue; } if (!earfound) { earfound = true; ear = vertices[j]; } else { if (vertices[j].Angle > ear.Angle) { ear = vertices[j]; } } } if (!earfound) { vertices.Clear(); return(0); } triangle = new TpplPoly(ear.Previous.P, ear.P, ear.Next.P); triangles.Add(triangle); ear.IsActive = false; ear.Previous.Next = ear.Next; ear.Next.Previous = ear.Previous; if (i == numvertices - 4) { break; } UpdateVertex(ear.Previous, vertices); UpdateVertex(ear.Next, vertices); } for (i = 0; i < numvertices; i++) { if (vertices[i].IsActive) { triangle = new TpplPoly(vertices[i].Previous.P, vertices[i].P, vertices[i].Next.P); triangles.Add(triangle); break; } } vertices.Clear(); return(1); }
// Triangulates a polygon by ear clipping // time complexity O(n^2), n is the number of vertices // space complexity: O(n) // params: // poly : an input polygon to be triangulated // vertices have to be in counter-clockwise order // triangles : a list of triangles (result) // returns true on success, false on failure private static bool Triangulate_EC(TPPLPoly poly, out TPPLPolyList triangles) { triangles = new TPPLPolyList(); if (!poly.Valid()) { return(false); } int numvertices = poly.NumPoints; if (numvertices < 3) { return(false); } if (numvertices == 3) { triangles.Add(poly); return(true); } PartitionVertex[] vertices = new PartitionVertex[numvertices]; PartitionVertex ear = null; for (int i = 0; i < numvertices; i++) { vertices[i] = new PartitionVertex(); } for (int i = 0; i < numvertices; i++) { vertices[i].isActive = true; vertices[i].p = poly.GetPoint(i); if (i == (numvertices - 1)) { vertices[i].next = vertices[0]; } else { vertices[i].next = vertices[i + 1]; } if (i == 0) { vertices[i].previous = vertices[numvertices - 1]; } else { vertices[i].previous = vertices[i - 1]; } } for (int i = 0; i < numvertices; i++) { UpdateVertex(vertices[i], vertices, numvertices); } for (int i = 0; i < numvertices - 3; i++) { bool earfound = false; //find the most extruded ear for (int j = 0; j < numvertices; j++) { if (!vertices[j].isActive) { continue; } if (!vertices[j].isEar) { continue; } if (!earfound) { earfound = true; ear = vertices[j]; } else { if (vertices[j].angle > ear.angle) { ear = vertices[j]; } } } if (!earfound) { return(false); } triangles.Add(new TPPLPoly(ear.previous.p, ear.p, ear.next.p)); ear.isActive = false; ear.previous.next = ear.next; ear.next.previous = ear.previous; if (i == numvertices - 4) { break; } UpdateVertex(ear.previous, vertices, numvertices); UpdateVertex(ear.next, vertices, numvertices); } for (int i = 0; i < numvertices; i++) { if (vertices[i].isActive) { triangles.Add(new TPPLPoly(vertices[i].previous.p, vertices[i].p, vertices[i].next.p)); break; } } return(true); }