Bạn muốn góc của mũi tên tại bất kỳ thời điểm nào. Bạn nhớ rằng để tính một góc, có một tiếp tuyến. Nhưng đây là nơi suy nghĩ của bạn bắt đầu sai:
- Những gì bạn muốn là delta y / delta x, vì độ dốc là tốc độ thay đổi (được đề cập trong một trong những câu trả lời khác). Lưu ý rằng x chỉ là vị trí bạn đang ở bất kỳ thời điểm nào, không phải dx.
Ok, vì vậy nếu bạn bỏ qua ma sát không khí, thì vận tốc x của mũi tên là một hằng số.
Đầu tiên, phân hủy vận tốc thành các thành phần x và y. Bạn có thể chụp ở góc 45 độ hoặc 60 độ. Vì vậy, bạn cần launchVelocity và một góc, nó không phải là vô hướng.
Thứ hai, tính toán mọi thứ như gấp đôi, không nổi. Bạn không đủ tinh vi về số lượng để biết khi nào lỗi vòng sẽ không giết bạn, vì vậy đừng thử. Nó không phải là một trình tiết kiệm thời gian tuyệt vời trong mọi trường hợp.
Thứ ba, không sử dụng Math.pow, nó chậm và không chính xác như nhân cho các số nguyên. Ngoài ra, bạn có thể tiết kiệm rất nhiều thời gian bằng cách sử dụng biểu mẫu của Horner (xem bên dưới)
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
Nếu bạn đang tuyệt vọng về hiệu suất, bạn thậm chí có thể tính trước 0,5 * g, nhưng đoạn mã trên sẽ đưa bạn 90% quãng đường tới đó mà không làm điều gì quá điên rồ. Điểm chuẩn thực hiện điều này 10 triệu lần nếu bạn thích, phải thừa nhận rằng nó không phải là một lượng thời gian khổng lồ mà là phần trăm thông minh, nó khá lớn - các thư viện rất chậm trong Java
Vì vậy, nếu bạn muốn góc mà mũi tên sẽ đi, điều bạn muốn là
atan(dy/dx)
Và trong trường hợp này, điều đó sẽ làm việc vì dx là một hằng số. Nhưng nói chung, dx có thể bằng 0, vì vậy bạn thường muốn sử dụng:
atan2(dy, dx)
đó là một chức năng được thiết kế đặc biệt cho công việc này.
Nhưng như tôi đã nói, các hàm thư viện trong Java rất chậm và trong trường hợp này có cách làm tốt hơn mà không bị @FxIII ám chỉ ở trên.
Nếu vận tốc ngang luôn là v0x và vận tốc dọc là:
double vy = v0y - 0.5 * g * time;
thì đồng bằng của bạn là: vx, vy
Bạn không cần góc. Nếu bạn muốn vẽ một mũi tên, hãy sử dụng một cái gì đó trên danh nghĩa như:
cốt truyện (x, y, x + vx, y + vy);
Tôi không biết bạn đang vẽ gì, vì vậy nếu bạn cần góc để xoay nó (như bạn đang sử dụng JOGL) thì chắc chắn, hãy sử dụng góc.
Đừng quên nếu bạn đang sử dụng opengl để biến góc trở lại độ, vì ATAN2 trả về radian:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;