Anda ingin sudut panah pada suatu titik waktu. Anda ingat bahwa untuk menghitung sudut, ada garis singgung. Tapi di sinilah pemikiran Anda mulai salah:
- Yang Anda inginkan adalah delta y / delta x, karena slope adalah tingkat perubahan (disebutkan dalam salah satu jawaban lain). Perhatikan bahwa x hanya posisi di mana Anda berada kapan saja, bukan dx.
Ok, jadi jika Anda mengabaikan gesekan udara, maka kecepatan x panah adalah konstan.
Pertama, dekomposisi kecepatan menjadi komponen x dan y. Anda bisa memotret pada sudut 45 derajat atau 60 derajat. Jadi, Anda perlu launchVelocity dan sudut, itu bukan skalar.
Kedua, hitung semuanya sebagai ganda, bukan mengambang. Secara numerik Anda tidak cukup canggih untuk mengetahui kapan kesalahan pembulatan tidak akan membunuh Anda, jadi jangan coba-coba. Bagaimanapun, ini bukan penghemat waktu yang tepat.
Ketiga, jangan gunakan Math.pow, lambat dan tidak seakurat mengalikan untuk kekuatan integer. Anda juga dapat menghemat banyak waktu dengan menggunakan formulir Horner (lihat di bawah)
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
Jika Anda sangat membutuhkan kinerja, Anda bahkan dapat melakukan precompute 0,5 * g, tetapi kode di atas akan membawa Anda 90% dari perjalanan ke sana tanpa melakukan sesuatu yang terlalu gila. Benchmark melakukan ini 10 juta kali jika Anda mau, ini memang diakui bukan jumlah yang besar, tetapi secara persentase itu cukup besar - perpustakaan sangat lambat di Jawa
Jadi, jika Anda ingin sudut di mana panah harus pergi, yang Anda inginkan adalah
atan(dy/dx)
Dan dalam hal ini, itu akan berhasil karena dx adalah konstanta. Tetapi secara umum, dx bisa menjadi nol, jadi Anda biasanya ingin menggunakan:
atan2(dy, dx)
yang merupakan fungsi yang dirancang khusus untuk pekerjaan ini.
Tapi seperti yang saya katakan, fungsi perpustakaan di Jawa sangat lambat, dan dalam hal ini ada cara yang lebih baik untuk melakukannya tanpa disinggung oleh @FxIII di atas.
Jika kecepatan horizontal selalu v0x, dan kecepatan vertikal adalah:
double vy = v0y - 0.5 * g * time;
maka delta Anda adalah: vx, vy
Anda tidak perlu sudut. Jika Anda ingin menggambar panah, gunakan sesuatu yang nominal seperti:
plot (x, y, x + vx, y + vy);
Saya tidak tahu apa yang Anda gambar, jadi jika Anda perlu sudut untuk memutarnya (seperti Anda menggunakan JOGL) maka tentu saja, gunakan sudutnya.
Jangan lupa jika Anda menggunakan opengl untuk mengubah sudut kembali menjadi derajat, karena ATAN2 mengembalikan radian:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;