private void FortunesAlgorithm()
{
Vector2 s = Vector2.zero;
Rect sitesBounds = _sites.GetSitesBounds();
int sqrt_nsites = (int)Mathf.Sqrt(_sites.Count + 4);
HalfedgePriorityQueue halfedgePriorityQueue = new HalfedgePriorityQueue(sitesBounds.y, sitesBounds.height, sqrt_nsites);
EdgeList edgeList = new EdgeList(sitesBounds.x, sitesBounds.width, sqrt_nsites);
List <Halfedge> list = new List <Halfedge>();
List <Vertex> list2 = new List <Vertex>();
fortunesAlgorithm_bottomMostSite = _sites.Next();
Site site = _sites.Next();
while (true)
{
if (!halfedgePriorityQueue.Empty())
{
s = halfedgePriorityQueue.Min();
}
if (site != null && (halfedgePriorityQueue.Empty() || CompareByYThenX(site, s) < 0))
{
Halfedge halfedge = edgeList.EdgeListLeftNeighbor(site.Coord);
Halfedge edgeListRightNeighbor = halfedge.edgeListRightNeighbor;
Site site2 = FortunesAlgorithm_rightRegion(halfedge);
Edge edge = Edge.CreateBisectingEdge(site2, site);
_edges.Add(edge);
Halfedge halfedge2 = Halfedge.Create(edge, Side.LEFT);
list.Add(halfedge2);
edgeList.Insert(halfedge, halfedge2);
Vertex vertex;
if ((vertex = Vertex.Intersect(halfedge, halfedge2)) != null)
{
list2.Add(vertex);
halfedgePriorityQueue.Remove(halfedge);
halfedge.vertex = vertex;
halfedge.ystar = vertex.y + site.Dist(vertex);
halfedgePriorityQueue.Insert(halfedge);
}
halfedge = halfedge2;
halfedge2 = Halfedge.Create(edge, Side.RIGHT);
list.Add(halfedge2);
edgeList.Insert(halfedge, halfedge2);
if ((vertex = Vertex.Intersect(halfedge2, edgeListRightNeighbor)) != null)
{
list2.Add(vertex);
halfedge2.vertex = vertex;
halfedge2.ystar = vertex.y + site.Dist(vertex);
halfedgePriorityQueue.Insert(halfedge2);
}
site = _sites.Next();
continue;
}
if (!halfedgePriorityQueue.Empty())
{
Halfedge halfedge = halfedgePriorityQueue.ExtractMin();
Halfedge edgeListLeftNeighbor = halfedge.edgeListLeftNeighbor;
Halfedge edgeListRightNeighbor = halfedge.edgeListRightNeighbor;
Halfedge edgeListRightNeighbor2 = edgeListRightNeighbor.edgeListRightNeighbor;
Site site2 = FortunesAlgorithm_leftRegion(halfedge);
Site site3 = FortunesAlgorithm_rightRegion(edgeListRightNeighbor);
_triangles.Add(new Triangle(site2, site3, FortunesAlgorithm_rightRegion(halfedge)));
Vertex vertex2 = halfedge.vertex;
vertex2.SetIndex();
Edge edge2 = halfedge.edge;
Side?leftRight = halfedge.leftRight;
edge2.SetVertex(leftRight.Value, vertex2);
Edge edge3 = edgeListRightNeighbor.edge;
Side?leftRight2 = edgeListRightNeighbor.leftRight;
edge3.SetVertex(leftRight2.Value, vertex2);
edgeList.Remove(halfedge);
halfedgePriorityQueue.Remove(edgeListRightNeighbor);
edgeList.Remove(edgeListRightNeighbor);
Side side = Side.LEFT;
if (site2.y > site3.y)
{
Site site4 = site2;
site2 = site3;
site3 = site4;
side = Side.RIGHT;
}
Edge edge = Edge.CreateBisectingEdge(site2, site3);
_edges.Add(edge);
Halfedge halfedge2 = Halfedge.Create(edge, side);
list.Add(halfedge2);
edgeList.Insert(edgeListLeftNeighbor, halfedge2);
edge.SetVertex(SideHelper.Other(side), vertex2);
Vertex vertex;
if ((vertex = Vertex.Intersect(edgeListLeftNeighbor, halfedge2)) != null)
{
list2.Add(vertex);
halfedgePriorityQueue.Remove(edgeListLeftNeighbor);
edgeListLeftNeighbor.vertex = vertex;
edgeListLeftNeighbor.ystar = vertex.y + site2.Dist(vertex);
halfedgePriorityQueue.Insert(edgeListLeftNeighbor);
}
if ((vertex = Vertex.Intersect(halfedge2, edgeListRightNeighbor2)) != null)
{
list2.Add(vertex);
halfedge2.vertex = vertex;
halfedge2.ystar = vertex.y + site2.Dist(vertex);
halfedgePriorityQueue.Insert(halfedge2);
}
continue;
}
break;
}
halfedgePriorityQueue.Dispose();
edgeList.Dispose();
for (int i = 0; i < list.Count; i++)
{
Halfedge halfedge3 = list[i];
halfedge3.ReallyDispose();
}
list.Clear();
for (int j = 0; j < _edges.Count; j++)
{
Edge edge = _edges[j];
edge.ClipVertices(_plotBounds);
}
for (int k = 0; k < list2.Count; k++)
{
Vertex vertex = list2[k];
vertex.Dispose();
}
list2.Clear();
}