luckykaa: (geometry)
luckykaa ([personal profile] luckykaa) wrote2011-03-30 10:01 am
Entry tags:

Closest approach of two particles.

So, I'm trying to work out whether a projectile will hit a moving target.  That is, it its closest approach within the collision sphere of the target.

I have the position and velocity of the target and the position and velocity of the target.  The obvious way of doing this is work out the position w.r.t time, use pythagoras to work out the distance (or distance squared because it makes things easier), differentiate to work out the time of closest approach and then put t back into the previous formula to work out the distance. 

It works.  Probably.  But there has to be a nicer way.  It's not like I need to know the time this happens or the actual positions.  Just the distance.  Adding the extra variable just seems to be making things horribly complicated. 

So far what I have it that we can assume that the target is stationary at the origin, and subtract its position and velocity from our projectile, and work out closest approach to the origin.  Now, this will be when the origin is at a right angle to the modified vector.  I just can't work out how to establish how close this is.

Advice, mathematical geniuses of the interwebs?

[identity profile] ingaborg.livejournal.com 2011-03-30 10:32 am (UTC)(link)
I represented my line as two points - and I think it's equivalent to what you said first, a point and a vector, because the first point is current location of projectile, and the vector is its direction of movement expressed as a normalised vector. So I can get the 2nd point easily, by adding velocity to current position.

Still, I agree there ought to be a simple formula for the distance between 2 objects moving in a straight line.

[identity profile] luckykaa.livejournal.com 2011-03-30 11:25 am (UTC)(link)
Yes. Follow it now. dot project for projection of position vector onto line vector. Use that to establish distance. Use that to establish position, and then work out he square difference.

I'm just a bit confused by this line:

var t = DotProduct(diffX, diffY, dirX, dirY) / DotProduct(dirX, dirY, dirX, dirY);

Isn't the dot product going to be scaled by the square root of that? In my case it doesn't matter because my motion vector is a unit vector plus a speed but I'm a little confused that I don't quite get it.

EDIT: Ah! Got it! The result is scaled by length but so is the initial vector. So we divide by that squared!
Edited 2011-03-30 12:53 (UTC)

[identity profile] ingaborg.livejournal.com 2011-03-31 07:36 am (UTC)(link)
Oops! Sorry, I didn't read the function through before posting it. I should also have sent the DotProduct function. I'm sure you've already done your own version of this, but just for completeness here it is:

function DotProduct(x_1, y_1, x_2, y_2)
{
// finds the dot product of two vectors
return ((x_1 * x_2) + (y_1 * y_2));
}