Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

Many years ago I coded some AI for a budget pseudo-3d game. There was one calculation which I never really figured out the best way to do, and that was calculating where the enemy would end up if it stopped now. For example:

  • The enemy is currently at X = 540.0.
  • The enemy is moving right at 10 pixels per frame.
  • When the enemy wants to stop, it's speed will drop by 1 pixel per frame until it reaches zero.

Is there a simple formula that would get me the position where the enemy ends up when he is fully stopped? I ended up precalculating and hardcoding the offset which worked for my needs but would have to be calculated separately for enemies with different speeds.

share|improve this question

4 Answers 4

up vote 7 down vote accepted

I generally agree with John's answer. I'm going to offer a slightly modified formula (which adds an extra V/2 onto his value):

D = V / A * (V + A) / 2 

With V = 10 and A = 1, that gets D = 55. This is exactly the result of

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

which is the frame-by-frame motion of the enemy.

Here's kind of how you go about getting to that step.

  1. V: Current Velocity = 10 pixels/frame, A: Current Acceleration = 1 pixels/frame^2
  2. T: Time To Come to a Stop = V/A = 10 frames.
  3. Distance Traveled in 10 frames = frame1 + frame2 + frame3 + ... = V +(V-A)+(V-2*A) + ...
  4. This is equal to T * V - A/2 * T * (T-1), which simplifies to the above equation.
share|improve this answer
    
+1 I can't see any logic flaws in your solution, and I really can't remember how I came across my solution. So my expression must be wrong and I probably didn't notice due to the small difference and lack of detailed testing? Would my expression become correct if I simply added half of the velocity? –  John McDonald Oct 26 '11 at 20:17
    
I answered my own question using power calc. Taking my expression + (v/2) appears to always equal your expression for any given v and a. –  John McDonald Oct 26 '11 at 20:25
    
Thanks to both @John and you, this would have saved me a lot of effort back in the days! I'm accepting this answer, since it's simpler and more efficient but John's answer is highly appreciated as well. Cheers guys! –  Kaivosukeltaja Oct 27 '11 at 6:40

I had the exact same issue when working on my game, and it took me forever to get the math right (bleh). So here it is:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

Re-written into regular math:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

Where acceleration in your case is 1, and linearVelocity is 10:

(1 / 2) * (10 / 1)^2
= 50 units to stop

EDIT

Jimmy's result and explanation are both correct. My formula requires that you also add half of the velocity.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

or

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55
share|improve this answer
2  
Just for the record, Math.Pow() is a terrible, terrible idea here. It may special-case the '2.0' exponent if it's smart enough, but any way you slice it, rewriting that expression as '0.5*linearVelocity*linearVelocity/Acceleration' should be a huge win. –  Steven Stadnicki Oct 26 '11 at 23:26

Calculations about changing velocities is the entire point of calculus. I haven't done it in a while so I don't remember off the top of my head, but I think your situation is simply taking the integral of -1 (ie. the deceleration).

share|improve this answer

Isn't this constant acceleration motion?

X = Xi + V*t + (1/2) * a * (t^2)

Where:
X: Last position
Xi: Initial position
V: Velocity
t: Time
a: Acceleration

The only tricky part here is how to determine "t", since we slow down with an acceleration of -1, then we can calculate t = V/a , then t is 10.

so,
Xi: 540
V: 10
t: 10
a: -1

Put everything on:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

The formula comes from by taking integration of acceleration: Check here

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.