Desea el ángulo de la flecha en cualquier momento. Recordaste que para calcular un ángulo, hay una tangente. Pero aquí es donde su pensamiento comenzó a salir mal:
- Lo que quiere es delta y / delta x, porque la pendiente es la tasa de cambio (mencionado en una de las otras respuestas). Tenga en cuenta que x es solo la posición en la que se encuentra en cualquier momento, no dx.
Ok, entonces si descuidas la fricción del aire, entonces la velocidad x de la flecha es constante.
Primero, descomponga la velocidad en componentes x e y. Podría disparar en un ángulo de 45 grados o 60 grados. Por lo tanto, necesita launchVelocity y un ángulo, no es escalar.
Segundo, calcule todo como doble, no como flotante. No eres lo suficientemente sofisticado numéricamente para saber cuándo el error de redondeo no te matará, así que no lo intentes. No es un gran ahorro de tiempo en ningún caso.
Tercero, no use Math.pow, es lento y no es tan preciso como multiplicar por potencias enteras. También puede ahorrar mucho tiempo utilizando el formulario de Horner (ver más abajo)
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 está desesperado por el rendimiento, incluso puede calcular previamente 0.5 * g, pero el código anterior lo llevará al 90% del camino sin hacer nada demasiado loco. Benchmark haciendo esto 10 millones de veces si lo desea, ciertamente no es una gran cantidad de tiempo, pero en términos de porcentaje es bastante grande: las bibliotecas son muy lentas en Java
Entonces, si querías el ángulo en el que debe ir la flecha, lo que quieres es
atan(dy/dx)
Y en este caso, eso funcionaría porque dx es una constante. Pero en general, dx puede ser cero, por lo que generalmente desea usar:
atan2(dy, dx)
que es una función específicamente diseñada para este trabajo.
Pero como dije, las funciones de la biblioteca en Java son horriblemente lentas, y en este caso hay una mejor manera de hacerlo sin lo mencionado anteriormente por @FxIII.
Si la velocidad horizontal es siempre v0x, y la velocidad vertical es:
double vy = v0y - 0.5 * g * time;
entonces su delta es: vx, vy
No necesitas el ángulo. Si desea dibujar una flecha, use algo nominalmente como:
plot (x, y, x + vx, y + vy);
No sé qué estás dibujando, así que si necesitas el ángulo para rotarlo (como si estuvieras usando JOGL), entonces seguro, usa el ángulo.
No olvide si está usando opengl para volver a convertir el ángulo en grados, porque ATAN2 devuelve radianes:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;