Vous voulez l'angle de la flèche à tout moment. Vous vous souvenez que pour calculer un angle, il y a une tangente. Mais voici où votre réflexion a commencé à mal tourner:
- Ce que vous voulez, c'est delta y / delta x, car la pente est le taux de variation (mentionné dans l'une des autres réponses). Notez que x est juste la position où vous vous trouvez à tout moment, pas dx.
Ok, donc si vous négligez le frottement de l'air, la vitesse x de la flèche est constante.
Tout d'abord, décomposez la vitesse en composantes x et y. Vous pourriez photographier à un angle de 45 degrés ou 60 degrés. Vous avez donc besoin de launchVelocity et d'un angle, ce n'est pas un scalaire.
Deuxièmement, calculez tout comme double et non flottant. Vous n'êtes pas suffisamment sophistiqué numériquement pour savoir quand une erreur d'arrondi ne vous tuera pas, alors n'essayez pas. Ce n'est pas un grand gain de temps en tout cas.
Troisièmement, n'utilisez pas Math.pow, c'est lent et pas aussi précis que de multiplier pour des puissances entières. Vous pouvez également gagner beaucoup de temps en utilisant le formulaire de Horner (voir ci-dessous)
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
Si vous cherchez désespérément des performances, vous pouvez même précalculer 0,5 * g, mais le code ci-dessus vous mènera à 90% du chemin sans rien faire de trop fou. Benchmark faisant cela 10 millions de fois si vous le souhaitez, ce n'est certes pas beaucoup de temps, mais en pourcentage, c'est assez grand - les bibliothèques sont très lentes en Java
Donc, si vous vouliez l'angle auquel la flèche devrait aller, ce que vous voulez c'est
atan(dy/dx)
Et dans ce cas, cela fonctionnerait parce que dx est une constante. Mais en général, dx peut être nul, vous devez donc généralement utiliser:
atan2(dy, dx)
qui est une fonction spécialement conçue pour ce travail.
Mais comme je l'ai dit, les fonctions de bibliothèque en Java sont horriblement lentes, et dans ce cas, il y a une meilleure façon de le faire sans comme mentionné par @FxIII ci-dessus.
Si la vitesse horizontale est toujours v0x et la vitesse verticale est:
double vy = v0y - 0.5 * g * time;
alors votre delta est: vx, vy
Vous n'avez pas besoin de l'angle. Si vous vouliez dessiner une flèche, utilisez quelque chose nominalement comme:
tracé (x, y, x + vx, y + vy);
Je ne sais pas ce que vous dessinez, donc si vous avez besoin de l'angle pour le faire pivoter (comme vous utilisez JOGL), alors bien sûr, utilisez l'angle.
N'oubliez pas si vous utilisez opengl pour retourner l'angle en degrés, car ATAN2 renvoie des radians:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;