Załóżmy że strzelec jest w punkcie 0, a X0 to pozycja startowa celu poruszającego się z prędkością S.
Cel w chwili t ma więc pozycję:
X = X0 + t*S
Pocisk wychodzi z punktu zero z wektorem prędkości V. Jego pozycja w chwili t to:
P = t*V
Prędkość pocisku jest zadaną (tylko nie znamy kierunku) jako v0 więc mamy:
|V| = v0
No i szukamy takiego t, dla którego będzie trafienie, czyli:
P = X
Składając to wszystko mamy zestaw warunków:
1. X = X0 + t*S
2. P = t*V
3. |V| = v0
4. P = X
Z połączenia 1+2+4 mamy:
t*V = X0 + t*S
Czyli po uproszczeniu nasze równania to:
X0 + t*(S-V) = 0
|V| = v0
Rozpisując wektory na składowe:
x0x + t*(sx-vx) = 0
x0y + t*(sy-vy) = 0
vx*vx + vy*vy = v0 // tutaj od razu uprościć można pierwiastek
Pozostaje tylko to rozwiązać - na przykład wyciągając vx i vy z pierwszych dwóch równań:
vx = (x0x + t*sx)/t
vy = (x0y + t*sy)/t
... i podstawiając do trzeciego wyjdzie nam:
( (x0x + t*sx)/t )^2 + ( (x0y + t*sy)/t )^2 = v0
Mnożąc obie strony przez t^2 (zakładamy że t=0 nie jest odpowiedzią) wyjdzie nam zwykłe równanie kwadratowe na t:
(x0x + t*sx)^2 + (x0y + t*sy)^2 = v0
Mnożymy:
x0x^2 + t*sx*x0x + (t*sx)^2 + x0y^2 + t*sy*x0y + (t*sy)^2 - v0 = 0
Porządkujemy:
( sx + sy )*t^2 + ( sx*x0x + sy*x0y )*t + ( x0x^2 + x0y^2 - v0 ) = 0
Po czym pozostało rozwiązać zwykłe równanie kwadratowe na t. Z rozwiązań które wyjdą wybieramy najmniejsze t, które jest większe od zera (bo czas nie może być ujemny ani zero, a chcemy trafić jak najszybciej jeżeli są dwie opcje). Może wyjść, że nie ma poprawnych wyników i nie można trafić celu (z reguły: bo pocisk jest za wolny i nie doleci).
Po czym podstawiając wybrane t do wzorów:
vx = (x0x + t*sx)/t
vy = (x0y + t*sy)/t
Mamy finalną prędkość.
Smacznego. :)