PDA

View Full Version : Shortest distance from point to Catmull-Rom spline


Lantz
Jun16-03, 10:51 AM
If I have a point P, how do I project it onto a Catmull-Rom spline (ie. get the point on the spline closest to P)?

This is how I calculate the spline, t goes from 0 to 1 (C++):

float t2 = t * t;
float t3 = t2 * t;
out.x = 0.5f * ( ( 2.0f * p1.x ) +
( -p0.x + p2.x ) * t +
( 2.0f * p0.x - 5.0f * p1.x + 4 * p2.x - p3.x ) * t2 +
( -p0.x + 3.0f * p1.x - 3.0f * p2.x + p3.x ) * t3 );
out.y = 0.5f * ( ( 2.0f * p1.y ) +
( -p0.y + p2.y ) * t +
( 2.0f * p0.y - 5.0f * p1.y + 4 * p2.y - p3.y ) * t2 +
( -p0.y + 3.0f * p1.y - 3.0f * p2.y + p3.y ) * t3 );
out.z = 0.5f * ( ( 2.0f * p1.z ) +
( -p0.z + p2.z ) * t +
( 2.0f * p0.z - 5.0f * p1.z + 4 * p2.z - p3.z ) * t2 +
( -p0.z + 3.0f * p1.z - 3.0f * p2.z + p3.z ) * t3 );


Which I derived from the forumla on this page (http://www.mvps.org/directx/articles/catmull/). Should I use the, whats it called, the smallest square solution or something? My math skills does not go beyond one variable calculus and linear algebra so I have no clue whatsoever.

Regards,
Lantz

suffian
Jun20-03, 12:15 PM
I tried looking into the actual solution but it quickly became bloated and even with mathematica on my side i ran into a 5th degree polynomial i needed to solve.

But I bet you need speed more than pinpoint accuracy. I suggest you draw lines that "emanate" out from the source of the point and see what the distance is for each line to intersect with the curve and then simply choose the smallest as the direction you want to head. By adjusting the number of lines you use you can trade-off speed for accuracy.

Lantz
Jun21-03, 07:08 PM
Yea you're right, speed is more important than accuracy in my case. And that sounds like a way to do it. I'll give it a shot and see if I come up with anything, thanks dude.

/me scratches his head