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(); }