/// <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; }