private static void ClassifyIntersection([NotNull] ISegmentList source, [NotNull] ISegmentList target, [NotNull] IntersectionPoint3D intersectionPoint, out bool isInbound, out bool isOutbound) { Assert.False(intersectionPoint.Type == IntersectionPointType.Unknown, "Cannot classify unknown intersection type."); if (intersectionPoint.Type == IntersectionPointType.LinearIntersectionIntermediate) { isInbound = false; isOutbound = false; return; } int?previousTargetSegment = intersectionPoint.GetNonIntersectingTargetSegmentIndex(target, false); int?nextTargetSegment = intersectionPoint.GetNonIntersectingTargetSegmentIndex(target, true); Pnt3D previousPntAlongTarget = previousTargetSegment == null ? null : target[previousTargetSegment.Value].StartPoint; Pnt3D nextPntAlongTarget = nextTargetSegment == null ? null : target[nextTargetSegment.Value].EndPoint; isInbound = nextPntAlongTarget != null && intersectionPoint.IsOnTheRightSide(source, nextPntAlongTarget, true); isOutbound = previousPntAlongTarget != null && intersectionPoint.IsOnTheRightSide(source, previousPntAlongTarget, true); }
private void GetAlongTargetDirectionChanges( int initialSourcePart, [NotNull] IntersectionPoint3D startingAt, [NotNull] Line3D entryLine, out double?targetForwardDirection, out double?targetBackwardDirection) { targetForwardDirection = null; targetBackwardDirection = null; if (CanFollowTarget(startingAt, true, initialSourcePart)) { int?forwardSegmentIdx = startingAt.GetNonIntersectingTargetSegmentIndex(Target, true); if (forwardSegmentIdx != null) { Line3D targetForward = Target[forwardSegmentIdx.Value]; targetForwardDirection = GetDirectionChange(entryLine, targetForward); } } if (CanFollowTarget(startingAt, false, initialSourcePart)) { int?backwardSegmentIdx = startingAt.GetNonIntersectingTargetSegmentIndex(Target, false); if (backwardSegmentIdx != null) { Line3D targetBackward = Target[backwardSegmentIdx.Value].Clone(); targetBackward.ReverseOrientation(); targetBackwardDirection = GetDirectionChange(entryLine, targetBackward); } } }