public static float Len(VtPoint a, VtPoint b) { var dx = a.X - b.X; var dy = a.Y - b.Y; return((float)Math.Sqrt(dx * dx + dy * dy)); }
public static void DelanuaStep(ref List <VtTriangle> triangles, VtPoint newPoint) { var badTriangles = new List <VtTriangle>(); var edges = new List <VtEdge>(); FindInvalidTriangles(triangles, newPoint, out badTriangles, out edges); edges = RemoveDuplicateEdges(edges); triangles = RemoveBadTriangles(triangles, badTriangles); FillHole(ref triangles, edges, newPoint); }
public static List <VtTriangle> GetTriangles(List <VtTriangle> triangles, VtPoint pt) { var result = new List <VtTriangle>(); for (int i = 0; i < triangles.Count; i++) { var tr = triangles[i]; if (tr.A == pt || tr.B == pt || tr.C == pt) { result.Add(tr); } } return(result); }
internal static void FindInvalidTriangles(List <VtTriangle> triangles, VtPoint newPoint, out List <VtTriangle> badTriangles, out List <VtEdge> allEdges) { badTriangles = new List <VtTriangle>(); allEdges = new List <VtEdge>(); for (int triCounter = 0; triCounter < triangles.Count; triCounter++) { if (EMath.Len(triangles[triCounter].CirC, newPoint) < triangles[triCounter].CirR) { badTriangles.Add(triangles[triCounter]); allEdges.Add(triangles[triCounter].AB); allEdges.Add(triangles[triCounter].BC); allEdges.Add(triangles[triCounter].AC); } } }
public static List <VtEdge> MissedEdges(this List <VtEdge> edges, float minX, float minY, float maxX, float maxY) { List <VtEdge> result = new List <VtEdge>(); var points = new List <VtPoint>(); for (int i = 0; i < edges.Count; i++) { var edge = edges[i]; var ex = points.FirstOrDefault(point => point == edge.S); if (ex != null) { points.Remove(ex); } else { points.Add(edge.S); } ex = points.FirstOrDefault(point => point == edge.E); if (ex != null) { points.Remove(ex); } else { points.Add(edge.E); } } if (points.Count != 2) { return(result); } var pt1 = points[0]; var pt2 = points[1]; if (Math.Abs(pt1.X - pt2.X) < float.Epsilon || Math.Abs(pt1.Y - pt2.Y) < float.Epsilon) { result.Add(new VtEdge(pt1, pt2)); return(result); } float x = 0, y = 0; if (Math.Abs(pt1.X - minX) < float.Epsilon || Math.Abs(pt1.X - maxX) < float.Epsilon) { x = pt1.X; } else if (Math.Abs(pt2.X - minX) < float.Epsilon || Math.Abs(pt2.X - maxX) < float.Epsilon) { x = pt2.X; } if (Math.Abs(pt1.Y - minY) < float.Epsilon || Math.Abs(pt1.Y - maxY) < float.Epsilon) { y = pt1.Y; } else if (Math.Abs(pt2.Y - minY) < float.Epsilon || Math.Abs(pt2.Y - maxY) < float.Epsilon) { y = pt2.Y; } var pt = new VtPoint(x, y); result.Add(new VtEdge(pt1, pt)); result.Add(new VtEdge(pt, pt2)); return(result); }
private static void FillHole(ref List <VtTriangle> triangles, List <VtEdge> polygonHole, VtPoint newPoint) { for (int polyCounter = 0; polyCounter < polygonHole.Count; polyCounter++) { triangles.Add(new VtTriangle(polygonHole[polyCounter].S, polygonHole[polyCounter].E, newPoint)); } }