Archived

This topic is now archived and is closed to further replies.

myme15

Speed question

Recommended Posts

myme15    122
In a 2D game I''m making, I have some alien spaceships that can roatate to any orientation. They need to be able to fire lasers and such from any angle, so the lasers need to be able to move along a ray extending from the alien at a certain angle. I move all the objects in my game by assigning them an x velocity and a y velocity, and adding these velocities to the object''s coordinates each frame. If I have the initial coordinates (x,y) and my angle A, how can I calculate the necessary x and y velocities for a projectile if it needs to move at a certain speed: sqrt((vx^2)+(vy^2)) = speed^2. I have figured out how to do this, but I need to use the sqrt() function in the calculation. I figure that having to calculate many sqrt()s each frame would be a big performance drain, so I need a way to do this without square rooting anything. In Andre LaMothe''s TOTWPG, he has a function called Fast_Distance_2D that speedily approximates sqrt(x^2+y^2). I think my problem can be solved with a similar method, but I have no idea how Fast_Distance_2D works, so I can''t figure it out. Here''s the code for Fast_Distance_2D:

int Fast_Distance_2D(int x, int y)
{
// this function computes the distance from 0,0 to x,y with 3.5% error

// first compute the absolute value of x,y
x = abs(x);
y = abs(y);

// compute the minimum of x,y
int mn = MIN(x,y);

// return the distance
return(x+y-(mn>>1)-(mn>>2)+(mn>>4));

} // end Fast_Distance_2D

 
Please help! Things are not what they are.

Share this post


Link to post
Share on other sites
thooot    122
Well, you don''t REALLY need to know how it works in order to use it. But I know that I don''t like using stuff I don''t understand, so here goes:

Without loss of generality (WOLOG) assume x < y

For every value of x and y, y = ax for some a = y / x. The whole idea behind this algorithm is finding an optimal value for a. The value used in this algorithm is 21/2, but I haven''t been able to verify that this is the optimal value (it works well though).

Note: 231 / 160 is approximately 21/2

So after a little algebraic manipulation:
y = 231x / 160
160y = 231x
160xy = 231x2
160xy + 25x2 = 231x2 + 25x2
160xy + 25x2 = 256x2
256y2 + 160xy + 25x2 = 256x2 + 256y2
(16y + 5x)2 = 256(x2 + y2)
16y + 5x = 16(x2 + y2)1/2
y + 5x / 16 = (x2 + y2)1/2
y + (16 - 8 - 4 + 1)x / 16 = (x2 + y2)1/2
y + x - x / 2 - x / 4 + x / 16 = (x2 + y2)1/2

And that''s it. The only mystery left is where they got 21/2 from.


Give a man a fish and you feed him for a day; teach him to use the Net and he won''t bother you for weeks.

Share this post


Link to post
Share on other sites
myme15    122
Actually, I really do need to know how it works. I can't use the actual function itself in my calculation (it does not perform the operation I need), but I hope to apply the principle of it to my problem.

Thanks for your help!

EDIT: I've solved my problem. Woohoo!




Things are not what they are.



[edited by - myme15 on June 9, 2002 11:38:35 PM]

Share this post


Link to post
Share on other sites
And what''s wrong with this:

You need to have a velocity and an angle the ship is in and simply get the amount of movement done:

---

Velocity_this_frame_by_x = cos(angle)*velocity;
Velocity_this_frame_by_y = sin(angle)*velocity;

---

tadadam

---
Keep it simple, stupid

Share this post


Link to post
Share on other sites
Divide    122
quote:

And what''s wrong with this:

You need to have a velocity and an angle the ship is in and simply get the amount of movement done:

---

Velocity_this_frame_by_x = cos(angle)*velocity;
Velocity_this_frame_by_y = sin(angle)*velocity;

---



Well.. Most compilers are set on radians, so you have to divide the angle by 3.14 and multiply it by 180

And it''s prolly wise to use a lookup table, but besides that,
nice work

Share this post


Link to post
Share on other sites
Zipster    2365
quote:
The only mystery left is where they got 21/2 from.

My first guess is that it''s chosen for all those speedy bitshifts at the end. Other than that, the math works out nicely with the perfect squares and roots. Besides, all mathamaticians have a place in their hearts for 21/2

Share this post


Link to post
Share on other sites
llvllatrix    340
Are you nuts?

You are using trig for simple lasers? Use vectors instead (vector line equations). They are so much easier and the most complicated operator you will ever enounter is divide. For velocity all you have to do is adjust t. Im assuming you want all your objects moving at a velocity that wont change its direction (you dont need an x and y velocity).

Share this post


Link to post
Share on other sites
myme15    122
To clarify my problem for you people, basically I wasn''t thinking straight. I failed to realize that

(cos(angle)*speed)^2 + (sin(angle)*speed)^2 = speed^2

Now that I realize this, my question seems kinda stupid .

llvllatrix: I find trig very easy and fast (as long as you use lookup tables). I''m a high school freshman, and I haven''t studied vector math yet, so I don''t use it. Maybe I should read up on it and see the error of my ways




Things are not what they are.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
Would using sqrt these days cause a huge performance hit? Im using lots of them in my code and it runs fine. I though these computers had seperate math processors to handle things like sqrt with no performance hit? Floating point is no longer slow either?

Share this post


Link to post
Share on other sites
myme15    122
Floating point is very fast with the latest processors, but I''m not taking any chances with sqrt.




Things are not what they are.

Share this post


Link to post
Share on other sites