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