Reverse trajectory calculation 2

Posted on 2009-05-18
Last Modified: 2013-12-26
  x = vx * t
  y = vy * t + c * t²

  sqr( vx² + vy² ) = 1
  c >= 0
  t >= 0 (in practice t >= abs( x ))

Note: vx and vy ARE NOT v*x and v*y - they are unique variables.

When the numbers c, x and y are known,
for a given value of t,
  how do I determine if the equation can be solved?
  if the equation can be solved,
    how do I determine the values of vx and vy?

Nice to know:
  x,y = position (relative to origin)
  vx,vy = direction (normalized)
  c = curvature
  t = time
Question by:JasonMewes
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Author Comment

ID: 24419116
NOTE!!! For clarification: vx and vy ARE NOT v*x and v*y, they are to be intepreted as their own variables/parameters.
LVL 84

Expert Comment

ID: 24419343
x = vx * t
y = vy * t + c * t²
sqr( vx² + vy² ) = 1

vx = x/t
vy = (y - c * t²)

if sqr( vx² + vy² ) = 1, then the equation can be solved
LVL 84

Expert Comment

ID: 24419351
x = vx * t
y = vy * t + c * t²
sqr( vx² + vy² ) = 1

vx = x/t
vy = (y - c * t²)/t

if sqr( vx² + vy² ) = 1, then the equation can be solved
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

LVL 84

Expert Comment

ID: 24419397
If t is not given,
x² + (y - c * t²)² = t²

x² + y² - 2*c * t² + (t²)² = t²

x² + y² - (2*c +1)* t² + (t²)²
 (t²)² + (1-2c) t² + x² + y² = 0
(t²) = (-(1-2c) ±sqr((1-2c)² - 4(x² + y² ))/2
which is solvable if (1-2c)² > 4(x² + y² ) and sqr((1-2c) - 4(x² + y² ) > (1-2c)

Author Comment

ID: 24419690
if i understand this correctly - when c is contant, there are always two possible t for every vx and vy (and vice versa)? i guess this does seem to fit the results of my simulations...

please have look at the following though:

 c  =  7
 t  =  0.1050
 vx =  0.4664581256585
 vy = -0.8845432815907
 x =   0.0489781031941
 y =  -0.0157020445670
 t1 = Sqr((-(1 - (2 * c)) + Sqr(((1 - (2 * c)) ^ 2) - (4 * ((x ^ 2) + (y ^ 2)))) / 2))
 t2 = Sqr((-(1 - (2 * c)) - Sqr(((1 - (2 * c)) ^ 2) - (4 * ((x ^ 2) + (y ^ 2)))) / 2))
 t1 =  4.4158573916999
 t2 =  2.5495496653664

what am i doing wrong?

the formalas above have been converted to "vbscript annotation" hope it is not too confusing
LVL 20

Accepted Solution

thehagman earned 500 total points
ID: 24420286
There's a little error in ozo's derivation (some y's anc c's got lost):
x = vx * t
y = vy * t + c * t²
vx²+vy² = 1
t² = t² * (vx² + vy²) = (vx t)² + (vy t)² = x² + (y - c t²)²
With T := t², this gives
T = x² + y² - 2 y c T + c² T²
c² T² - (2 c y +1) T + (x²+y²) = 0.
This is solveable iff
(2 c y +1)² >= 4 c² (x²+y²)
[or equivalently:  (y +1/(2c))² >= x²+y²]
in which case the solutions are
T = ( (2 c y +1) +- sqrt( (2 c y +1)² - 4 c² (x²+y²)) )/(2c²)
The value of t is then +-sqrt(T) for each of these values of T (provided T>=0).

With x =   0.0489781031941,  y =  -0.0157020445670, we find
T = ( 0.78017  +- sqrt(0.09017) )/98, i.e.
T1 = 0.011025, T2 = 0.004897.
Since both are positive, we obtain a total of four t-values:
t = +- 0.105 and t = +- 0.07


Author Closing Comment

ID: 31582883
Excellent, your math worked out perfectly and in combination with ozo's second post I was able to implement it in practice to calculate the two possible trajectories for a given destination, as well as the time it will take for the "projectile" to arrive there. Very much appreciated!
LVL 84

Expert Comment

ID: 24423962
x² + (y - c * t²)² = t²

x² + y² - 2*c * t² + c² * (t²)² = t²

x² + y² - (2*c +1)* t² + c² * (t²)²
c² * (t²)² - (1+2c) t² + x² + y² = 0
(t²) = ((1+2c) ±sqr((1+2c)² - 4(x² + y² )c² )/(2c²)
which is solvable if (1+2c)² > 4(x² + y² )c² and sqr((1+2c) - 4(x² + y² )c²) > -(1+2c)

Expert Comment

ID: 24437448

Thanks for the version 1 points.

I understand what you want to accomplish with those equations, but I am not sure you've phrased it out in the correct way in both versions. For a realistic "trajectory" (!), your Vx and Vy should actually be Vx0 and Vy0, which are initial speeds along horizontal and vertical axes, according to your formulation. c is a constant, which is actually g, 9.8, in most cases. In a case like that, Vxt at any time t always equals to Vx0, but Vyt is a variable which is affected by the value of c. Vx0 and Vy0 can be any combinations that satisfy the restriction from your 3rd equation -- sqr( Vx0² + Vy0² ) = 1, and the number of possible combinations are infinite.

PS: I think you somehow got confused between the initial speeds Vx0 and Vy0, and the speeds at time t, Vxt and Vyt. If you have an accelerating factor of c, which will acts on either Vx or Vy, or both. If you re-formulate your equations carefully with clear distinction between these variables and constants, the problems can be really easy to solve almost effortlessly. Please let me know if I can be of further help.


Author Comment

ID: 24466904
ozo, sorry that still does not test out. your formula is very close to hagmans:
t² = ( (2 c y +1) +- sqrt( (2 c y +1)² - 4 c² (x²+y²)) )/(2c²)
for easy comparison yours is equivalent to (i think):
t² = ( (2 c   +1) +- sqrt( (2 c   +1)² - 4 c² (x²+y²)) )/(2c²)

sqr(vx²+vy²) using your formula gives me values that are well off 1, while hagmans formula always results in 1 for both t-values using your formulation:

vx = x/t
vy = (y - c * t²)/t

hagmans formulation has already proven itself in practice (it checks out perfectly every time) so i'm considering the problem solved - just thought i'd let you know. still mighty good work tho, thanks for your help!


Regarding "version 1" I made a mistake and the formulas were incorrect alltogether. That formula would have resulted in a linear trajectory which is nothing like the code from which it was taken. You are right that vx and vy are initial speeds (or velocity) They are the result of normalization of the target offset in the game, ie vx|y = target_x|y / sqr( target_x² + target_y² ). They might as well have been (and for bot code they are) derived from an angle using cos/sin which is why sqr( vx² + vy² ) is always 1. Did I say c was a constant? Sorry about that - not true. c is not g (since you write 9.8 i am guessing you mean gravitational accelleration?) c in this instance is the "curvature" of the weapon that was used to fire the "projectile". For example the "rifle" has a curvature of 2, while the "grenade launcher" has a curvature of 8. t is actually "real world" time * speed in the game since different weapons have different speeds as well. since it was not necessary to solve the question i ommitted this part.

While I am not very good with mathematics I did perform a good deal of simulations while waiting for an answer to this post, and I found that there seemed to always be exactly two possible initial trajectory angles (vx,vy) for which the trajectory intersected each exact point in space. This seems to be verified by hagmans and (almost) ozos formulations so I can only assume that they are correct and that there are not an unlimited number of possibilities.

What I was trying to accomplish was to calculate the "perfect" targeting (velocity) vector at which to fire a projectile using a given weapon (c) and the target location. Since the target is moving I am now using an iterative algorithm that takes the average of the trajectory time (t from hagmans formula) and the target predictor time (tp) and feeds this back into the target predictor (which results in the variables x and y) until the two times match up closely enough (tp=t), then I calculate vx and vy using vx = x / t, vy = ( y - c * ( t * t ) ). The result is an absolute perfect hit each and every time, given that the prediction parameters for the target do not change while the projectile is in transit - it is after all impossible to tell the future.

My post may seem confused, I am good at formulating code - not math =) but I assure you I am not confused as to the difference between initial speed and speed at time t. Speed at time t is never calculated and never comes into play for this particular problem. I erroneously thought that there was a solution for every x, y and t which is why I asked about a solution "for a given value of t" but as ozo pointed out the solution to this was just as easy as it seemed - and pointed in the direction of calculating t instead. As it turns out this was what i really wanted. The fact that there are two possible trajectories for each target location was an added bonus and provides me with a slower "fallback" trajectory that I can use when the target is behind a wall that will block the direct trajectory =)

Thanks everyone for your help!

Author Comment

ID: 24466959
Oh and when I said vx|y = target_x|y / sqr( target_x² + target_y² ) i meant "target" as in where the user/player is aiming - like a cursor of sorts.

When I wrote "target" while explaining the iterative algorithm I am referring to the opponent players position. The target predictor is an algorithm that predicts an opponents location into the future given that particular opponents input and the world geometry.

Sorry, did not mean to confuse - I always manage to do just that =)
Hope you got what I was trying to explain anyways...

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Iteration: Iteration is repetition of a process. A student who goes to school repeats the process of going to school everyday until graduation. We go to grocery store at least once or twice a month to buy products. We repeat this process every mont…
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

732 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question