Вы хотите угол наклона стрелки в любой момент времени. Вы вспомнили, что для вычисления угла есть касательная. Но вот где ваше мышление начало идти не так:
- То, что вы хотите, это дельта y / delta x, потому что наклон - это скорость изменения (упоминается в одном из других ответов). Обратите внимание, что x это просто позиция, в которой вы находитесь в любой момент времени, а не dx.
Итак, если вы пренебрегаете воздушным трением, то x-скорость стрелки постоянна.
Сначала разложим скорость на составляющие x и y. Вы можете снимать под углом 45 или 60 градусов. Так что вам нужна скорость запуска и угол, это не скаляр.
Во-вторых, вычислите все как двойные, а не как плавающие. Вы недостаточно развиты, чтобы знать, когда ошибка округления не убьет вас, так что не пытайтесь. В любом случае, это не очень хорошая экономия времени.
В-третьих, не используйте Math.pow, он медленный и не такой точный, как умножение на целые числа. Также вы можете сэкономить много времени, используя форму Хорнера (см. Ниже)
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
Если вы отчаянно нуждаетесь в производительности, вы можете даже предварительно рассчитать 0,5 * g, но приведенный выше код отнимет у вас 90% пути, не делая ничего слишком сумасшедшего. Если вы хотите, тесты делают это 10 миллионов раз, это, правда, не так уж много времени, но в процентном отношении это довольно много - библиотеки в Java работают очень медленно
Итак, если вы хотите угол, под которым стрелка должна идти, то вы хотите, чтобы
atan(dy/dx)
И в этом случае это будет работать, потому что dx является константой. Но в общем случае dx может быть нулевым, поэтому вы обычно хотите использовать:
atan2(dy, dx)
которая является функцией, специально разработанной для этой работы.
Но, как я уже сказал, библиотечные функции в Java ужасно медленные, и в этом случае есть лучший способ сделать это без упоминания @FxIII выше.
Если горизонтальная скорость всегда v0x, а вертикальная скорость:
double vy = v0y - 0.5 * g * time;
тогда ваша дельта: vx, vy
Вам не нужен угол. Если вы хотите нарисовать стрелку, используйте что-то вроде:
сюжет (x, y, x + vx, y + vy);
Я не знаю, что вы рисуете, поэтому, если вам нужен угол, чтобы повернуть его (как вы используете JOGL), тогда обязательно используйте угол.
Не забудьте, если вы используете opengl, чтобы повернуть угол обратно в градусы, потому что ATAN2 возвращает радианы:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;