Ejemplo n.º 1
0
        void ProcessLowEdgeEvent(AxisEdgeLowPointEvent lowEdgeEvent)
        {
            var edge = lowEdgeEvent.AxisEdge;

            var containerNode = GetOrCreateAxisEdgesContainer(edge);

            containerNode.Item.AddEdge(edge);
            var prev = edgeContainersTree.Previous(containerNode);

            if (prev != null)
            {
                foreach (var prevEdge in prev.Item)
                {
                    foreach (var ed in containerNode.Item)
                    {
                        TryToAddRightNeighbor(prevEdge, ed);
                    }
                }
            }

            var next = edgeContainersTree.Next(containerNode);

            if (next != null)
            {
                foreach (var ed in containerNode.Item)
                {
                    foreach (var neEdge in next.Item)
                    {
                        TryToAddRightNeighbor(ed, neEdge);
                    }
                }
            }
            ConstraintEdgeWithObstaclesAtZ(edge, edge.Source.Point);
        }
Ejemplo n.º 2
0
        void CloseConesCoveredBySegment(Point leftPoint, Point rightPoint, RbTree <ConeSide> tree)
        {
            RBNode <ConeSide> node = tree.FindFirst(
                s => Point.GetTriangleOrientation(s.Start, s.Start + s.Direction, leftPoint) ==
                TriangleOrientation.Counterclockwise);

            Point x;

            if (node == null || !Point.IntervalIntersectsRay(leftPoint, rightPoint,
                                                             node.Item.Start, node.Item.Direction, out x))
            {
                return;
            }
            var conesToRemove = new List <Cone>();

            do
            {
                conesToRemove.Add(node.Item.Cone);
                node = tree.Next(node);
            } while (node != null && Point.IntervalIntersectsRay(leftPoint, rightPoint,
                                                                 node.Item.Start, node.Item.Direction, out x));


            foreach (Cone cone in conesToRemove)
            {
                RemoveCone(cone);
            }
        }
Ejemplo n.º 3
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);
            }
        }
Ejemplo n.º 4
0
        internal RBNode <BasicReflectionEvent> FindNextInRange(RBNode <BasicReflectionEvent> prev, Point high)
        {
            RBNode <BasicReflectionEvent> nextNode = eventTree.Next(prev);

            if ((null != nextNode) && (Compare(nextNode.Item.Site, high) <= 0))
            {
                return(nextNode);
            }
            return(null);
        }
Ejemplo n.º 5
0
            public bool MoveNext()
            {
                if (_currentNode == null)
                {
                    _currentNode = _tree.First;
                }
                else
                {
                    _currentNode = _tree.Next(_currentNode);
                }

                return(!_currentNode.IsNull);
            }
Ejemplo n.º 6
0
        void LookForIntersectionWithConeLeftSide(RBNode <ConeSide> leftNode)
        {
            //Show(new Ellipse(1, 1, leftNode.item.Start));


            var coneLeftSide = leftNode.Item as ConeLeftSide;

            if (coneLeftSide != null)
            {
                //leftNode = leftSegmentTree.TreePredecessor(leftNode);
                //if (leftNode != null) {
                //    var seg = leftNode.item as ObstacleSideSegment;
                //    if (seg != null)
                //        TryIntersectionOfConeLeftSideAndObstacleConeSide(coneLeftSide, seg);
                //}

                RightObstacleSide rightObstacleSide = FindFirstObstacleSideToTheLeftOfPoint(coneLeftSide.Start);
                if (rightObstacleSide != null)
                {
                    TryIntersectionOfConeLeftSideAndObstacleSide(coneLeftSide, rightObstacleSide);
                }
            }
            else
            {
                var seg = (BrokenConeSide)leftNode.Item;
                leftNode = leftConeSides.Next(leftNode);
                if (leftNode != null)
                {
                    coneLeftSide = leftNode.Item as ConeLeftSide;
                    if (coneLeftSide != null)
                    {
                        TryIntersectionOfConeLeftSideAndObstacleConeSide(coneLeftSide, seg);
                    }
                }
            }
        }
Ejemplo n.º 7
0
        void TriangulateEmptySpaceToTheRight(RBNode <CdtFrontElement> piNode)
        {
            var piSite  = piNode.Item.LeftSite;
            var piPoint = piSite.Point;
            var piNext  = front.Next(piNode);

            while (piNext != null)
            {
                var frontElem = piNext.Item;
                var r         = frontElem.LeftSite;
                var rp        = frontElem.RightSite;
                if ((r.Point - piPoint) * (rp.Point - r.Point) < 0)
                {
//see figures 9(a) and 9(b) of the paper
                    piNode = ShortcutTwoFrontElements(piNode, piNext);
                    piNext = front.Next(piNode);
                }
                else
                {
                    TryTriangulateBasinToTheRight(piNode);
                    break;
                }
            }
        }
        void ProcessRightFrontPiercedElement()
        {
            var v = piercedToTheRightFrontElemNode;

            do
            {
                elementsToBeRemovedFromFront.Add(v.Item);
                AddSiteToRightPolygon(v.Item.RightSite);
                v = front.Next(v);
            } while (Point.PointToTheRightOfLine(v.Item.RightSite.Point, a.Point, b.Point)); //that is why we are adding to the right polygon
            elementsToBeRemovedFromFront.Add(v.Item);
            AddSiteToLeftPolygon(v.Item.RightSite);
            if (v.Item.RightSite == b)
            {
                piercedToTheRightFrontElemNode = v; //this will stop the traversal
                return;
            }
            FindPiercedTriangle(v);
            piercedToTheRightFrontElemNode = null;
        }
 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);
     }
 }
        void CloseConesCoveredBySegment(Point leftPoint, Point rightPoint, RbTree<ConeSide> tree) {
            var node = tree.FindFirst(
                s => Point.GetTriangleOrientation(s.Start, s.Start + s.Direction, leftPoint) ==
                     TriangleOrientation.Counterclockwise);

            Point x;
            if (node == null || !Point.IntervalIntersectsRay(leftPoint, rightPoint,
                                                             node.Item.Start, node.Item.Direction, out x))
                return;
            var conesToRemove = new List<Cone>();
            do {
                conesToRemove.Add(node.Item.Cone);
                node = tree.Next(node);
            } while (node != null && Point.IntervalIntersectsRay(leftPoint, rightPoint,
                                                                 node.Item.Start, node.Item.Direction, out x));


            foreach (var cone in conesToRemove)
                RemoveCone(cone);
        }