Você deseja o ângulo da seta a qualquer momento. Você lembrou que, para calcular um ângulo, há uma tangente. Mas aqui é onde seu pensamento começou a dar errado:
- O que você deseja é delta y / delta x, porque a inclinação é a taxa de mudança (mencionada em uma das outras respostas). Observe que x é apenas a posição em que você está a qualquer momento, e não dx.
Ok, então se você negligenciar a fricção do ar, a velocidade x da seta é uma constante.
Primeiro, decomponha a velocidade nos componentes x e y. Você pode fotografar em um ângulo de 45 graus ou 60 graus. Então você precisa do launchVelocity e de um ângulo, não é um escalar.
Segundo, calcule tudo como duplo, e não flutuante. Você não é numericamente sofisticado o suficiente para saber quando o erro de arredondamento não o mata, portanto, não tente. De qualquer forma, não economiza muito tempo.
Terceiro, não use Math.pow, é lento e não é tão preciso quanto multiplicar por potências inteiras. Além disso, você pode economizar muito tempo usando o formulário de Horner (veja abaixo)
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
Se você está desesperado por desempenho, pode até precompor 0,5 * g, mas o código acima o levará 90% do caminho sem fazer nada muito louco. Faça benchmark fazendo isso 10 milhões de vezes, se desejar, não é uma quantidade enorme de tempo, mas em termos percentuais é bastante grande - as bibliotecas são muito lentas em Java
Então, se você queria o ângulo em que a flecha deveria ir, o que você quer é
atan(dy/dx)
E, neste caso, isso funcionaria porque dx é uma constante. Mas, em geral, dx pode ser zero, então você geralmente deseja usar:
atan2(dy, dx)
que é uma função projetada especificamente para este trabalho.
Mas, como eu disse, as funções de biblioteca em Java são terrivelmente lentas e, nesse caso, há uma maneira melhor de fazê-lo sem o mencionado @FxIII acima.
Se a velocidade horizontal for sempre v0x e a velocidade vertical for:
double vy = v0y - 0.5 * g * time;
então seu delta é: vx, vy
Você não precisa do ângulo. Se você quiser desenhar uma flecha, use algo nominalmente como:
plot (x, y, x + vx, y + vy);
Não sei o que você está desenhando, portanto, se você precisar do ângulo para girá-lo (como se estivesse usando o JOGL), use o ângulo.
Não se esqueça de usar o opengl para transformar o ângulo novamente em graus, porque o ATAN2 retorna radianos:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;