# Find the closest point on a ray

I've got a ray defined by P1 and P2, and then a target P3, and I want to find P4. How do I go about this? I've come to understand that I should use vector projection, but I can't get it to work. Any help? I'm using C# and XNA.

Closest distance point segment:

float SqDistPointSegment(Point a, Point b, Point c)
{
Vector ab = b – a, ac = c – a, bc = c – b;
float e = Dot(ac, ab);
// Handle cases where c projects outside ab
if (e <= 0.0f) return Dot(ac, ac);
float f = Dot(ab, ab);
if (e >= f) return Dot(bc, bc);
// Handle cases where c projects onto ab
return Dot(ac, ac) – e * e / f;
}


Source: Christer Ericson Real Time Collision Detection. You can find all kind of algorithms for this things in that book, take it, it is a must.

Anyways to see the distance of a point to vector is easy just do:

vector.normalize().dot(point);

It gives you the distance. The vector must be normalized.

With this distance you can multiply it for the normalized vector and added to the P1 to get P4. Then:

Vector rayDir = (P2 - P1).normalize();
P4 = P1 + rayDir.Dot(P3)*rayDir

• How do I use this method to get P4 from P1, P2 & P3? What are a, b, c from my example? I tried this method but it just gives me a large number which does not translate over to the length along the ray to the closest point. – jsmars Oct 13 '16 at 10:09
• @jsmars i edited it, i miss understood your question, look at the end. – Haruko Oct 13 '16 at 10:11
• Ah yes, now it works! Thanks so much! Does seem like a lot of mathematical steps to reach the target tho, I would think there should be a more efficient way to get the same result. – jsmars Oct 13 '16 at 10:20
• Actually nevermind that last comment, I just noticed that the final line doesn't use the method you posted. Looks efficient enough! :) – jsmars Oct 13 '16 at 10:25