luckykaa: (geometry)
[personal profile] luckykaa
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?

(no subject)

Date: 2011-03-30 10:15 am (UTC)
From: [identity profile] luckykaa.livejournal.com
Ah! I think I've realised where I was going wrong! I was representing my live as a point and a vector. I should be representing it as a normal and distance to origin.

Now to look at your code and work out if that's what you;re doing:)

(no subject)

Date: 2011-03-30 10:32 am (UTC)
From: [identity profile] ingaborg.livejournal.com
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.

(no subject)

Date: 2011-03-30 11:25 am (UTC)
From: [identity profile] luckykaa.livejournal.com
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 Date: 2011-03-30 12:53 pm (UTC)

(no subject)

Date: 2011-03-31 07:36 am (UTC)
From: [identity profile] ingaborg.livejournal.com
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));
}
Page generated Jul. 16th, 2025 07:05 am
Powered by Dreamwidth Studios