/// <summary>
        /// Coordinates of where a perpendicular projection intersects the provided coordinate.
        /// The first coordinate is of the closer intersection.
        /// Returns infinity if the point is coincident with the circular curve center.
        /// </summary>
        /// <param name="point">The point.</param>
        /// <param name="referenceArc">The line to which a perpendicular projection is drawn.</param>
        /// <returns>CartesianCoordinate.</returns>
        /// <exception cref="NotImplementedException"></exception>
        public static Tuple <CartesianCoordinate, CartesianCoordinate> CoordinatesOfPerpendicularProjection(CartesianCoordinate point, CircularCurve referenceArc)
        {
            if (point == referenceArc.Center)
            {
                return(new Tuple <CartesianCoordinate, CartesianCoordinate>(
                           new CartesianCoordinate(double.PositiveInfinity, double.PositiveInfinity),
                           new CartesianCoordinate(double.PositiveInfinity, double.PositiveInfinity)
                           ));
            }

            LinearCurve ray = new LinearCurve(referenceArc.Center, point);

            CartesianCoordinate[] intersectionCoordinates = referenceArc.IntersectionCoordinate(ray);

            double distance1 = CartesianOffset.Separation(point, intersectionCoordinates[0]);
            double distance2 = CartesianOffset.Separation(point, intersectionCoordinates[1]);
            CartesianCoordinate intersectionClose = (distance1 < distance2) ? intersectionCoordinates[0] : intersectionCoordinates[1];
            CartesianCoordinate intersectionFar   = (distance1 < distance2) ? intersectionCoordinates[1] : intersectionCoordinates[0];

            return(new Tuple <CartesianCoordinate, CartesianCoordinate>(intersectionClose, intersectionFar));
        }
 /// <summary>
 /// The length of the chord connecting the start and end limits.
 /// </summary>
 /// <param name="relativePositionStart">Relative position along the path at which the length measurement is started.</param>
 /// <param name="relativePositionEnd">Relative position along the path at which the length measurement is ended.</param>
 /// <returns>System.Double.</returns>
 public override double ChordLengthBetween(double relativePositionStart, double relativePositionEnd)
 {
     return(LinearCurve.Length(CoordinateCartesian(relativePositionStart), CoordinateCartesian(relativePositionEnd)));
 }
 /// <summary>
 /// The length of the chord connecting the start and end limits.
 /// </summary>
 /// <returns>System.Double.</returns>
 public override double ChordLength()
 {
     return(LinearCurve.Length(Range.Start.Limit, Range.End.Limit));
 }
 /// <summary>
 /// Returns points where the circular curve intersects the provided linear curve.
 /// </summary>
 /// <param name="otherLine">Linear curve that intersects the current linear curve.</param>
 /// <returns>CartesianCoordinate.</returns>
 public CartesianCoordinate[] IntersectionCoordinate(LinearCurve otherLine)
 {
     return(IntersectionLinearCircular.IntersectionCoordinates(otherLine, this));
 }