Ви хочете, щоб кут стрілки в будь-який момент часу. Ви згадали, що для обчислення кута існує дотична. Але ось де ваше мислення почало йти не так:
- Те, що ви хочете, - дельта y / дельта 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 * г, але наведений вище код приведе вас до 90% шляху, не роблячи нічого надто шаленого. Benchmark робить це 10 мільйонів разів, якщо вам подобається, це, мабуть, не величезна кількість часу, але відсотково-розумно це досить велика - бібліотеки на Java дуже повільні
Отже, якщо ви хотіли кут, під яким стрілка повинна йти, те, що ви хочете
atan(dy/dx)
І в цьому випадку це буде працювати, тому що dx - це константа. Але загалом dx може бути нульовим, тому зазвичай ви хочете використовувати:
atan2(dy, dx)
що є функцією, спеціально розробленою для цієї роботи.
Але, як я вже говорив, функції бібліотеки на Яві жахливо повільні, і в цьому випадку є кращий спосіб зробити це без того, як нагадав @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;