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); }
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); } }
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); } }
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); }
public bool MoveNext() { if (_currentNode == null) { _currentNode = _tree.First; } else { _currentNode = _tree.Next(_currentNode); } return(!_currentNode.IsNull); }
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); } } } }
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); }