public static bool IsFlatAngle(TPoint p1, TPoint p2, TPoint p3) { return(CrossProduct(p1, p2, p3) == 0); }
public override bool Equals(object point) { TPoint p = point as TPoint; return(p.x == x && p.y == y); }
public float Distance(TPoint p) { return((float)Math.Sqrt(Distance2(p))); }
public Edge(TPoint p1, TPoint p2) { this.p1 = p1; this.p2 = p2; }
public bool InCircumCircle(TPoint p) { float[] circle = GetCircumCircle(); return(p.IsInCircle(circle[0], circle[1], circle[2])); }
public static List <Triangle> Triangulate(List <TPoint> vertices) { int nvertices = vertices.Count; if (vertices.Count < 3) { return(null); } int trmax = nvertices * 4; float minX = vertices[0].x; float minY = vertices[0].y; float maxX = minX; float maxY = minY; for (int i = 0; i < nvertices; i++) { TPoint vertex = vertices[i]; vertex.id = i; if (vertex.x < minX) { minX = vertex.x; } if (vertex.y < minY) { minY = vertex.y; } if (vertex.x > maxX) { maxX = vertex.x; } if (vertex.y > maxY) { maxY = vertex.y; } } float dx = (maxX - minX) * convexMultiplier; float dy = (maxY - minY) * convexMultiplier; float deltaMax = Math.Max(dx, dy); float midx = (minX + maxX) * 0.5f; float midy = (minY + maxY) * 0.5f; TPoint p1 = new TPoint(midx - 2 * deltaMax, midy - deltaMax); TPoint p2 = new TPoint(midx, midy + 2 * deltaMax); TPoint p3 = new TPoint(midx + 2 * deltaMax, midy - deltaMax); p1.id = nvertices; p2.id = nvertices + 1; p3.id = nvertices + 2; vertices.Add(p1); vertices.Add(p2); vertices.Add(p3); List <Triangle> triangles = new List <Triangle>(); triangles.Add(new Triangle(vertices[nvertices], vertices[nvertices + 1], vertices[nvertices + 2])); for (int i = 0; i < nvertices; i++) { List <Edge> edges = new List <Edge>(); int nTriangles = triangles.Count; for (int j = triangles.Count - 1; j >= 0; j--) { Triangle curTriangle = triangles[j]; if (curTriangle.InCircumCircle(vertices[i])) { edges.Add(curTriangle.e1); edges.Add(curTriangle.e2); edges.Add(curTriangle.e3); triangles.RemoveAt(j); } } for (int j = edges.Count - 2; j >= 0; j--) { for (int k = edges.Count - 1; k >= j + 1; k--) { if (j < edges.Count && k < edges.Count && edges[j].Same(edges[k])) { edges.RemoveAt(j); if (edges.Count > 0) { edges.RemoveAt(k - 1); } } } } for (int j = 0; j < edges.Count; j++) { int n = triangles.Count; triangles.Add(new Triangle(edges[j].p1, edges[j].p2, vertices[i])); } } for (int i = triangles.Count - 1; i >= 0; i--) { Triangle triangle = triangles[i]; if (triangle.p1.id > nvertices || triangle.p2.id > nvertices || triangle.p3.id > nvertices) { triangles.RemoveAt(i); } } for (int i = 0; i < 3; i++) { vertices.RemoveAt(i); } return(triangles); }