private void GetEdgesForDelaunayCell(DelaunayCell cell, Dictionary <MIVector, VoronoiCell> verticesToVoronoi) { for (int i = 0; i < 3; i++) { var verticesOnEdge = cell.Vertices.Where((_, j) => j != i).ToArray(); VoronoiCell cell1 = verticesToVoronoi[verticesOnEdge[0]]; VoronoiCell cell2 = verticesToVoronoi[verticesOnEdge[1]]; MIVector from, to; if (cell.Adjacency[i] == null) { GetInfiniteEdge(cell, verticesOnEdge, out from, out to); } else { from = cell.Circumcenter; to = cell.Adjacency[i].Circumcenter; } if (!_vecEq(from, to)) { if (!cell1.Edges.Any((e) => (_vecEq(e.Item1, from) && _vecEq(e.Item2, to)) || (_vecEq(e.Item1, to) && _vecEq(e.Item2, from)))) { cell1.Edges.Add(new Tuple <MIVector, MIVector>(from, to)); } if (!cell2.Edges.Any((e) => (_vecEq(e.Item1, from) && _vecEq(e.Item2, to)) || (_vecEq(e.Item1, to) && _vecEq(e.Item2, from)))) { cell2.Edges.Add(new Tuple <MIVector, MIVector>(from, to)); } } } }
private static void GetInfiniteEdge(DelaunayCell cell, MIVector[] verticesOnEdge, out MIVector from, out MIVector to) { from = cell.Circumcenter; var factor = 100 * IsLeft(verticesOnEdge[0], verticesOnEdge[1], from) * IsLeft(verticesOnEdge[0], verticesOnEdge[1], cell.Center); var fromToEdgeMidpoint = new MIVector(0.5 * (verticesOnEdge[0].Position[0] + verticesOnEdge[1].Position[0] - from.X), 0.5 * (verticesOnEdge[0].Position[1] + verticesOnEdge[1].Position[1]) - from.Z); to = new MIVector(from.X + factor * fromToEdgeMidpoint.X, from.Z + factor * fromToEdgeMidpoint.Z); }