private void Sweep()
        {
            if (tangents.Count < 2)
            {
                return;
            }
            for (int i = 1; i < tangents.Count; i++)   //we processed the first element already
            {
                Tangent t = tangents[i];
                if (t.Diagonal != null)
                {
                    if (t.Diagonal.RbNode == activeDiagonalTree.TreeMinimum())
                    {
                        AddVisibleEdge(t);
                    }
                    if (t.IsHigh)
                    {
                        RemoveDiagonalFromActiveNodes(t.Diagonal);
                    }
                }
                else
                {
                    if (t.IsLow)
                    {
                        this.activeDiagonalComparer.PointOnTangentAndInsertedDiagonal = t.End.Point;
                        this.InsertActiveDiagonal(new Diagonal(t, t.Comp));
                        if (t.Diagonal.RbNode == activeDiagonalTree.TreeMinimum())
                        {
                            AddVisibleEdge(t);
                        }
                    }
                }

#if TEST_MSAGL
                //List<ICurve> cs = new List<ICurve>();

                //foreach (Diagonal d in this.activeDiagonalTree) {
                //    cs.Add(new LineSegment(d.Start, d.End));
                //}

                //foreach (Polygon p in this.polygons)
                //    cs.Add(p.Polyline);

                //cs.Add(new LineSegment(t.Start.Point, t.End.Point));
                //SugiyamaLayoutSettings.Show(cs.ToArray);
#endif
            }
        }
Beispiel #2
0
        private void ExtendPathAlongOutEdges(VertexEntry bestEntry, RbTree <VisibilityEdge> edges, Directions preferredBendDir)
        {
            // Avoid GetEnumerator overhead.
            var outEdgeNode = edges.IsEmpty() ? null : edges.TreeMinimum();

            for (; outEdgeNode != null; outEdgeNode = edges.Next(outEdgeNode))
            {
                ExtendPathAlongEdge(bestEntry, outEdgeNode.Item, false, preferredBendDir);
            }
        }
Beispiel #3
0
        void FindBeforeAfterV(VisibilityVertex v, RbTree <VisibilityVertex> nodeBoundaryRbTree,
                              out VisibilityVertex beforeV, out VisibilityVertex afterV, Point center)
        {
            Point xDir   = new Point(1, 0);
            var   vAngle = Point.Angle(xDir, v.Point - center);
            var   rNode  = nodeBoundaryRbTree.FindLast(w => Point.Angle(xDir, w.Point - center) <= vAngle);

            beforeV = rNode != null ? rNode.Item : nodeBoundaryRbTree.TreeMaximum().Item;
            rNode   = nodeBoundaryRbTree.FindFirst(w => Point.Angle(xDir, w.Point - center) >= vAngle);
            afterV  = rNode != null ? rNode.Item : nodeBoundaryRbTree.TreeMinimum().Item;
        }
 void FindBeforeAfterV(VisibilityVertex v, RbTree<VisibilityVertex> nodeBoundaryRbTree,
     out VisibilityVertex beforeV, out VisibilityVertex afterV, Point center) {
     Point xDir=new Point(1,0);
     var vAngle = Point.Angle(xDir, v.Point - center);
     var rNode = nodeBoundaryRbTree.FindLast(w => Point.Angle(xDir, w.Point - center) <= vAngle);
     beforeV = rNode!=null? rNode.Item : nodeBoundaryRbTree.TreeMaximum().Item;
     rNode = nodeBoundaryRbTree.FindFirst(w => Point.Angle(xDir, w.Point - center) >= vAngle);
     afterV = rNode != null ? rNode.Item : nodeBoundaryRbTree.TreeMinimum().Item;
 }
Beispiel #5
0
 public KeyValuePair <TKey, TValue> First()
 {
     return(tree.TreeMinimum().Item);
 }
 private void ExtendPathAlongOutEdges(VertexEntry bestEntry, RbTree<VisibilityEdge> edges, Directions preferredBendDir) {
     // Avoid GetEnumerator overhead.
     var outEdgeNode = edges.IsEmpty() ? null : edges.TreeMinimum();
     for (; outEdgeNode != null; outEdgeNode = edges.Next(outEdgeNode)) {
         ExtendPathAlongEdge(bestEntry, outEdgeNode.Item, false, preferredBendDir);
     }
 }
Beispiel #7
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();
        }