Okun açısını herhangi bir zamanda istersiniz. Bir açıyı hesaplamak için bir teğet olduğunu hatırladınız. Ancak burada düşünceniz yanlış gitmeye başladı:
- İstediğiniz şey delta y / delta x, çünkü eğim değişim oranıdır (diğer cevaplardan birinde belirtilmiştir). X'in dx değil, herhangi bir zamanda bulunduğunuz konum olduğunu unutmayın.
Tamam, eğer hava sürtünmesini ihmal ederseniz, o zaman okun x hızı sabittir.
İlk olarak, hızı x ve y bileşenlerine ayırın. 45 derecelik veya 60 derecelik bir açıda çekim yapıyor olabilirsiniz. Bu yüzden launchVelocity ve bir açıya ihtiyacınız var, bu bir skaler değil.
İkincisi, her şeyi float değil, çift olarak hesaplayın. Roundoff hatasının sizi ne zaman öldürmeyeceğini bilmek için sayısal olarak sofistike değilsiniz, bu yüzden denemeyin. Her durumda büyük bir zaman tasarrufu değildir.
Üçüncüsü, Math.pow'u kullanma, yavaş ve tamsayı güçleri için çarpma kadar doğru değil. Ayrıca Horner'ın formunu kullanarak çok zaman kazanabilirsiniz (aşağıya bakın)
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
Performans için çaresizseniz, 0.5 * g'yi önceden hesaplayabilirsiniz, ancak yukarıdaki kod çok çılgın bir şey yapmadan sizi% 90 oranında oraya götürecektir. Benchmark bunu 10 milyon kez yapıyorsa, kuşkusuz çok büyük bir zaman değil, yüzde olarak oldukça büyük - kütüphaneler Java'da çok yavaş
Yani, okun gitmesi gereken açıyı istiyorsanız, istediğiniz şey
atan(dy/dx)
Ve bu durumda, dx sabit olduğu için bu işe yarar. Ancak genel olarak, dx sıfır olabilir, bu nedenle genellikle kullanmak istersiniz:
atan2(dy, dx)
bu iş için özel olarak tasarlanmış bir işlevdir.
Ama dediğim gibi, Java'daki kütüphane işlevleri korkunç derecede yavaş ve bu durumda yukarıdaki @FxIII tarafından belirtildiği gibi bunu yapmanın daha iyi bir yolu var.
Yatay hız her zaman v0x ise ve dikey hız ise:
double vy = v0y - 0.5 * g * time;
o zaman deltalarınız: vx, vy
Açıya ihtiyacınız yok. Bir ok çizmek istiyorsanız, nominal olarak şöyle bir şey kullanın:
çizim (x, y, x + vx, y + vy);
Ne çizdiğinizi bilmiyorum, bu yüzden döndürmek için açıya ihtiyacınız varsa (JOGL kullandığınız gibi), o zaman açıyı kullanın.
Açıyı tekrar dereceye çevirmek için opengl kullanıyorsanız unutmayınız, çünkü ATAN2 radyan döndürür:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;