void LookForIntersectionWithConeRightSide(RBNode <ConeSide> rightNode)
        {
            //Show(new Ellipse(10, 5, rightNode.item.Start));
            var coneRightSide = rightNode.Item as ConeRightSide;

            if (coneRightSide != null)
            {
                //rightNode = rightSegmentTree.TreeSuccessor(rightNode);
                //if (rightNode != null) {
                //    var seg = rightNode.item as ObstacleSideSegment;
                //    if (seg != null)
                //        TryIntersectionOfConeRightSideAndObstacleConeSide(coneRightSide, seg);
                //}

                LeftObstacleSide leftObstacleSide = FindFirstObstacleSideToToTheRightOfPoint(coneRightSide.Start);
                if (leftObstacleSide != null)
                {
                    TryIntersectionOfConeRightSideAndObstacleSide(coneRightSide, leftObstacleSide);
                }
            }
            else
            {
                var seg = (BrokenConeSide)rightNode.Item;
                rightNode = rightConeSides.Previous(rightNode);
                if (rightNode != null)
                {
                    coneRightSide = rightNode.Item as ConeRightSide;
                    if (coneRightSide != null)
                    {
                        TryIntersectionOfConeRightSideAndObstacleConeSide(coneRightSide, seg);
                    }
                }
            }
        }
Exemple #2
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);
        }
Exemple #3
0
        CdtSite LeftCase(CdtSite pi, RBNode <CdtFrontElement> hittedFrontElementNode, out CdtSite rightSite)
        {
            //left case
            //                if(db)ShowFrontWithSite(pi, new LineSegment(pi.Point, hittedFrontElementNode.Item.Edge.upperSite.Point), new LineSegment(pi.Point, hittedFrontElementNode.Item.Edge.lowerSite.Point));
            Debug.Assert(ApproximateComparer.Close(pi.Point.X, hittedFrontElementNode.Item.X));
            var hittedFrontElement = hittedFrontElementNode.Item;

            InsertAndLegalizeTriangle(pi, hittedFrontElement);
            var prevToHitted = front.Previous(hittedFrontElementNode);
            var leftSite     = prevToHitted.Item.LeftSite;

            rightSite = hittedFrontElementNode.Item.RightSite;
            //                if(db)ShowFrontWithSite(pi, new LineSegment(pi.Point, leftSite.Point), new LineSegment(pi.Point, prevToHitted.Item.RightSite.Point));
            InsertAndLegalizeTriangle(pi, prevToHitted.Item);
            front.DeleteNodeInternal(prevToHitted);
            var d = front.Remove(hittedFrontElement);

            Debug.Assert(d != null);
            return(leftSite);
        }
        void ProcessLeftFrontPiercedElement()
        {
            // CdtSweeper.ShowFront(triangles, front,new []{new LineSegment(a.Point, b.Point),new LineSegment(piercedToTheLeftFrontElemNode.Item.Edge.lowerSite.Point,piercedToTheLeftFrontElemNode.Item.Edge.upperSite.Point)},null);
            var v = piercedToTheLeftFrontElemNode;

            do
            {
                elementsToBeRemovedFromFront.Add(v.Item);
                AddSiteToLeftPolygon(v.Item.LeftSite);
                v = front.Previous(v);
            } while (Point.PointToTheLeftOfLine(v.Item.LeftSite.Point, a.Point, b.Point)); //that is why we are adding to the left polygon
            elementsToBeRemovedFromFront.Add(v.Item);
            AddSiteToRightPolygon(v.Item.LeftSite);
            if (v.Item.LeftSite == b)
            {
                piercedToTheLeftFrontElemNode = v; //this will stop the traversal
                return;
            }
            FindPiercedTriangle(v);
            piercedToTheLeftFrontElemNode = null;
        }