/// <summary>
        /// Finds the point on this spline that minimises a given distance function
        /// </summary>
        /// <param name="distance"> Distance function </param>
        /// <param name="iterations"> Number of iterations (accuracy). 5 is pretty good. </param>
        /// <returns> Returns the time on the spline of the closest point </returns>
        public override float FindClosestPoint( DistanceToPointDelegate distance, int iterations )
        {
            DistanceCalculator calculator = new DistanceCalculator( distance );

            float closestFraction = 0;
            int numControlPoints = ControlPoints.Count;

            Evaluator eval = new Evaluator( );

            for ( int cpIndex = 0; cpIndex < numControlPoints; ++cpIndex )
            {
                MakeEvaluator( ref eval, this, cpIndex );
                closestFraction = calculator.GetClosestPointInInterval( eval, 1.0f, iterations );
            }

            return closestFraction;
        }
 /// <summary>
 /// Returns the point on the curve that minimises the specified distance function
 /// </summary>
 /// <remarks>
 /// It's faster to pass in squared distance function to minimise (e.g. Line3.GetSqrDistanceToPoint).
 /// </remarks>
 public abstract float FindClosestPoint( DistanceToPointDelegate distance, int iterations );
            /// <summary>
            /// Sets up the distance calculator
            /// </summary>
            /// <param name="distance"> Distance function to minimise </param>
            public DistanceCalculator( DistanceToPointDelegate distance )
            {
                m_S					= new float[ 4 ];
                m_S2				= new float[ 4 ];
                m_Distances			= new float[ 4 ];
                m_Points			= new Point3[ 4 ];
                m_PValues			= new float[ 4 ];
                m_Distance			= distance;

                m_ClosestDistance	= float.MaxValue;
                m_ClosestFraction	= 0;
            }
        /// <summary>
        /// Finds the point on this spline that minimises a given distance function
        /// </summary>
        /// <param name="distance"> Distance function </param>
        /// <param name="iterations"> Number of iterations (accuracy). 5 is pretty good. </param>
        /// <returns> Returns the time on the spline of the closest point </returns>
        public override float FindClosestPoint( DistanceToPointDelegate distance, int iterations )
        {
            CatmullRomSpline.DistanceCalculator calculator = new CatmullRomSpline.DistanceCalculator( distance );

            float closestFraction = 0;
            int numControlPoints = m_BaseSpline.ControlPoints.Count;

            CatmullRomSpline.Evaluator eval = new CatmullRomSpline.Evaluator( );

            for ( int cpIndex = 0; cpIndex < numControlPoints; ++cpIndex )
            {
                MakeEvaluator( ref eval, cpIndex, m_BaseSpline, m_Offset );
                closestFraction = calculator.GetClosestPointInInterval( eval, 1.0f, iterations );
            }

            return closestFraction;
        }