Delaunay.Edge.SetVertex C# (CSharp) Method

SetVertex() private method

private SetVertex ( LR leftRight, Vertex v ) : void
leftRight LR
v Vertex
return void
        internal void SetVertex(LR leftRight, Vertex v)
        {
            if (leftRight == LR.LEFT)
            {
                _leftVertex = v;
            }
            else
            {
                _rightVertex = v;
            }
        }

Usage Example

コード例 #1
0
        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();
        }