Shortest distance from point to Catmull-Rom spline

Click For Summary
SUMMARY

The discussion focuses on projecting a point onto a Catmull-Rom spline using C++ code. The provided code calculates the spline's coordinates based on four control points (p0, p1, p2, p3) and a parameter t ranging from 0 to 1. A user suggests an alternative approach involving drawing lines emanating from the point to find the closest intersection with the spline, prioritizing speed over accuracy. This method allows for a trade-off between the number of lines used and the precision of the result.

PREREQUISITES
  • Understanding of Catmull-Rom splines
  • Proficiency in C++ programming
  • Basic knowledge of calculus and linear algebra
  • Familiarity with numerical methods for optimization
NEXT STEPS
  • Research Catmull-Rom spline implementation in C++
  • Explore numerical methods for finding polynomial roots
  • Learn about optimization techniques for geometric problems
  • Investigate line intersection algorithms in computational geometry
USEFUL FOR

Computer graphics developers, game developers, and anyone involved in spline-based modeling or pathfinding algorithms.

Lantz
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++):
Code:
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. Should I use the, what's 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
 
Mathematics news on Phys.org
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.
 
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
 

Similar threads

  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 11 ·
Replies
11
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
Replies
2
Views
3K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 5 ·
Replies
5
Views
4K
  • · Replies 11 ·
Replies
11
Views
2K
  • · Replies 2 ·
Replies
2
Views
4K
  • · Replies 11 ·
Replies
11
Views
2K