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