Ejemplo n.º 1
0
        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));
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }