Example #1
0
        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);
                }
            }
        }