private void RemoveDiagonalFromActiveNodes(Diagonal diag)
        {
            RBNode <Diagonal> changedNode = activeDiagonalTree.DeleteSubtree(diag.RbNode);

            if (changedNode != null)
            {
                if (changedNode.Item != null)
                {
                    changedNode.Item.RbNode = changedNode;
                }
            }
            diag.LeftTangent.Diagonal  = null;
            diag.RightTangent.Diagonal = null;
        }
Esempio n. 2
0
        void SweepPolylinePoint(PolylinePoint v)
        {
            PolylinePoint inSide  = GetIncomingSide(v);
            PolylinePoint outSide = GetOutgoingSide(v);


            //if (inEdge != null && outEdge != null)
            //    SugiyamaLayoutSettings.Show(new LineSegment(inEdge.Start.Point, inEdge.End.Point), new LineSegment(outEdge.Start.Point,
            //        outEdge.End.Point), new LineSegment(this.q, v.Point));
            //else if (inEdge != null)
            //    SugiyamaLayoutSettings.Show(new LineSegment(inEdge.Start.Point, inEdge.End.Point), new LineSegment(this.q, v.Point));
            //else if (outEdge != null)
            //    SugiyamaLayoutSettings.Show(new LineSegment(outEdge.Start.Point, outEdge.End.Point), new LineSegment(this.q, v.Point));

            activeEdgeComparer.IntersectionOfTheRayAndInsertedEdge = v.Point;
            RBNode <PolylinePoint> node;

            if (sideNodes.TryGetValue(inSide, out node) && node != null)
            {
//we have an active edge
                if (node == activeSidesTree.TreeMinimum())
                {
                    AddEdge(v);
                }

                if (outSide != null)
                {
                    node.Item          = outSide; //just replace the edge since the order does not change
                    sideNodes[outSide] = node;
                }
                else
                {
                    RBNode <PolylinePoint> changedNode = activeSidesTree.DeleteSubtree(node);
                    if (changedNode != null)
                    {
                        if (changedNode.Item != null)
                        {
                            sideNodes[changedNode.Item] = changedNode;
                        }
                    }
                }
                sideNodes.Remove(inSide);
            }
            else   //the incoming edge is not active
            if (outSide != null)
            {
                RBNode <PolylinePoint> outsideNode;
                if (!sideNodes.TryGetValue(outSide, out outsideNode) || outsideNode == null)
                {
                    outsideNode        = activeSidesTree.Insert(outSide);
                    sideNodes[outSide] = outsideNode;
                    if (outsideNode == activeSidesTree.TreeMinimum())
                    {
                        AddEdge(v);
                    }
                }
            }
            else
            {
                throw new InvalidOperationException();
            }

            // CheckActiveSidesAreConsistent();
        }