internal List <VtPolygon> CalcVoronoy() { var result = new List <VtPolygon>(); for (int i = 0; i < Points.Count; i++) //for (int i = 0; i < 1; i++) { var pt = Points[i]; var poly = new VtPolygon(); List <VtTriangle> trs = GetTriangles(Triangles, pt); VtTriangle fTr = trs[0]; VtTriangle sTr = GetNeighbor(fTr, trs); poly.Edges.Add(new VtEdge(fTr.CirC, sTr.CirC)); for (int j = 2; j < trs.Count + 1; j++) { VtTriangle tTr = GetNeighbor(fTr, sTr, trs); poly.Edges.Add(new VtEdge(sTr.CirC, tTr.CirC)); fTr = sTr; sTr = tTr; } //poly.Edges.Add(new VEdge(poly.Edges.Last().E, poly.Edges.Last().S)); result.Add(poly); } return(result); }
internal List <VtTriangle> CalcDelanua(float border = 10) { // Bound box MinX = Points.Min(point => point.X); MinY = Points.Min(point => point.Y); MaxX = Points.Max(point => point.X); MaxY = Points.Max(point => point.Y); Triangles = new List <VtTriangle>(); var triangle = new VtTriangle( new VtPoint(MinX - border, MinY - border), new VtPoint(MinX - border, MaxY + border), new VtPoint(MaxX + border, MinY - border) ); Triangles.Add(triangle); triangle = new VtTriangle( new VtPoint(MinX - border, MaxY + border), new VtPoint(MaxX + border, MinY - border), new VtPoint(MaxX + border, MaxY + border) ); Triangles.Add(triangle); for (int i = 0; i < Points.Count; i++) { var pt = Points[i]; DelanuaStep(ref Triangles, pt); } return(Triangles); }
public static VtTriangle GetNeighbor(VtTriangle fTri, VtTriangle sTri, List <VtTriangle> tries) { for (int i = 0; i < tries.Count; i++) { var tri = tries[i]; // same - skip if (fTri == tri || sTri == tri) { continue; } if (sTri.HaveSameEdge(tri)) { return(tri); } } return(null); }