Chcesz kąt strzałki w dowolnym momencie. Pamiętasz, że aby obliczyć kąt, istnieje styczna. Ale tutaj twoje myślenie zaczęło się mylić:
- To, czego chcesz, to delta y / delta x, ponieważ nachylenie to szybkość zmian (wspomniana w jednej z pozostałych odpowiedzi). Zauważ, że x to tylko pozycja, w której jesteś w dowolnym momencie, a nie dx.
Ok, więc jeśli zaniedbacie tarcie powietrzne, wówczas prędkość x strzałki jest stała.
Najpierw rozłóż prędkość na składowe xiy. Możesz strzelać pod kątem 45 stopni lub 60 stopni. Potrzebujesz więc launchVelocity i kąta, to nie jest skalar.
Po drugie, oblicz wszystko jako podwójne, a nie zmiennoprzecinkowe. Nie jesteś wystarczająco zaawansowany numerycznie, aby wiedzieć, kiedy błąd zaokrągleń cię nie zabije, więc nie próbuj. W każdym razie nie jest to świetna oszczędność czasu.
Po trzecie, nie używaj Math.pow, jest powolny i nie tak dokładny, jak mnożenie potęg liczb całkowitych. Możesz także zaoszczędzić dużo czasu, korzystając z formularza Hornera (patrz poniżej)
final double DEG2RAD = Math.PI/180;
double ang = launchAngle * DEG2RAD;
double v0x = launchVelocity * cos(ang); // initial velocity in x
double v0y = launchVelocity * sin(ang); // initial velocity in y
double x = (v0x * time);
// double y = (v0y * time) + (0.5 * g * (float)Math.Pow(time, 2));
double y = (0.5 * g * time + v0y) * time
Jeśli zależy ci na wydajności, możesz nawet wstępnie obliczyć 0,5 * g, ale powyższy kod zabierze Cię tam w 90%, nie robiąc nic zbyt szalonego. Benchmark, robiąc to 10 milionów razy, jeśli chcesz, to wprawdzie nie jest to dużo czasu, ale pod względem procentowym jest dość duży - biblioteki są bardzo wolne w Javie
Tak więc, jeśli chcesz kąt, pod którym powinna iść strzała, to czego chcesz
atan(dy/dx)
W tym przypadku zadziałałoby, ponieważ dx jest stałą. Ale ogólnie dx może wynosić zero, więc zwykle chcesz użyć:
atan2(dy, dx)
która jest funkcją zaprojektowaną specjalnie do tego zadania.
Ale, jak powiedziałem, funkcje biblioteczne w Javie są strasznie powolne, i w tym przypadku jest lepszy sposób na zrobienie tego bez aluzji @FxIII powyżej.
Jeśli prędkość pozioma wynosi zawsze v0x, a prędkość pionowa wynosi:
double vy = v0y - 0.5 * g * time;
wtedy twoja delta to: vx, vy
Nie potrzebujesz kąta. Jeśli chcesz narysować strzałkę, użyj czegoś nominalnie takiego jak:
wykres (x, y, x + vx, y + vy);
Nie wiem, co rysujesz, więc jeśli potrzebujesz kąta, aby go obrócić (tak jak używasz JOGL), to na pewno użyj tego kąta.
Nie zapomnij, jeśli używasz opengl do zmiany kąta z powrotem na stopnie, ponieważ ATAN2 zwraca radiany:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;