public static Point SplitByNextIntersection(Point startPoint, LineSegment segment, out SegmentBase segment1, out SegmentBase segment2)
 {
     return SplitByNextIntersection(startPoint, segment, out segment1, out segment2,
         new LineEquation(startPoint, segment),
         (t, p) => new LineSegment(p),
         t => new LineSegment(segment.EndPoint));
 }
        public Subpath(Point startPoint, [NotNull] IEnumerable<SegmentBase> segments, bool isClosed)
        {
            StartPoint = startPoint;
            Segments = segments.ToReadOnlyList();
            IsClosed = isClosed;

            if (Segments.Any(x => x == null))
            {
                throw new ArgumentException();
            }

            if (Segments.Count > 0 && EndPoint != StartPoint)
            {
                _closingSegment = new LineSegment(StartPoint);
            }
        }
 // ReSharper disable once SuggestBaseTypeForParameter
 public LineEquation(Point startPoint, LineSegment segment)
 {
     _startPoint = startPoint;
     _endPoint = segment.EndPoint;
 }