2013-08-04 66 views
5

Tôi đang tính toán góc cần bắn để phóng một tọa độ cụ thể.Tính góc cần thiết để nhấn tọa độ (x, y) từ vị trí khác (0,0) với độ cao khác nhau

Đạn của tôi nằm ở toạ độ ngẫu nhiên và tọa độ đích của tôi ở tọa độ tĩnh.

tôi đã kết thúc chạy qua phương trình sau đây trên Wikipedia để tính góc cần thiết để đạt mức phối hợp tại (x, y) từ (0,0):

Tôi đã thực hiện một số nỗ lực để hiểu điều này và công thức khác và cố gắng thực hiện sau đây (Tôi đang sử dụng C# và XNA).

double y = source.Y - target.Y; 
double x = Vector2.Distance(source, target); 
double v = 1440; //velocity 
double g = 25; //gravity 
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v))); 
sqrt = Math.Sqrt(sqrt); 
double angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x)); 

Tôi cũng đã cố gắng làm như sau, dẫn đến một góc giống nhau khi giá trị của v và g giữ nguyên.

double targetX = target.X - source.X; 
double targetY = -(target.Y - source.Y); 
double r1 = Math.Sqrt((v*v*v*v) - g*(g*(target.X*target.X) + ((2*target.Y)*(v*v)))); 
double a1 = ((v*v) + r1)/(g*target.X); 
angleInRadians = -Math.Atan(a1); 
if (targetX < 0) 
{ 
    angleInRadians -= 180/180*Math.PI; 
} 

phỏng đoán của tôi là ngay cả trong tôi (giả định) cố gắng không ra nguồn phối hợp, rằng tôi vẫn không thực hiện việc tính toán một cách chính xác cho tọa độ với một tổ chức phi (0,0) nguồn và độ cao khác nhau.

Dưới đây là hình ảnh mô tả hệ tọa độ của tôi. Nó là mặc định cho XNA.

+1

Tôi nghĩ bạn nên dịch vị trí thật sự của bạn (0,0) hệ thống dựa trên, thực hiện các chức năng đó và thực hiện một bản dịch chính thức từ (0,0) cho hệ thống thực tế ... giả sử không có yếu tố nào ngoài trọng lực, Góc tính toán phải giống nhau từ bất kỳ nguồn nào ... –

+0

Các tham số khác (đầu vào) nào ảnh hưởng đến đường dẫn chiếu, giống như hằng số vận tốc và trọng lực hoặc các biến khác là gì? –

+0

Trọng lực không phải là tiêu cực? Đó là -9.8m/s nếu tôi nhớ chính xác. –

Trả lời

2

Nhờ sự giúp đỡ trong các ý kiến ​​giải pháp cho thấy góc này đã kết thúc đòi hỏi rằng các vị trí được dịch sang một (0,0) dựa trên hệ thống. Đối với bất cứ ai tìm kiếm các kịch bản cùng một giải pháp làm việc cuối cùng là:

double x = -(source.x - target.x); 
double y = (source.y - target.y); 
double v = 1440; //m/s 
double g = 25; //m/s 
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v))); 
sqrt = Math.Sqrt(sqrt); 
angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x)); 

Sau đó, để chuyển đổi radian vào một vector làm việc với XNA, thực hiện các chuyển đổi sau:

Vector2 angleVector = new Vector2(-(float)Math.Cos(angleInRadians), (float)Math.Sin(angleInRadians)); 
+0

Để ghi lại, nếu có ai khác gặp phải điều này và thấy nó hữu ích: Giá trị trả về là một vectơ chuẩn hóa. Trong trường hợp của tôi, tôi chỉ phải mở rộng nó với vận tốc mõm phóng. sử dụng Java/libgdx: 'return angleVector.scl ((float) RifleBullet.projectileSpeed);' – Jarmund

1

Tôi nghĩ rằng vấn đề thực sự nằm trong việc sử dụng arctan. Vì phạm vi được giới hạn trong các kết quả -pi/2..pi/2 chỉ nằm trong nửa mặt phẳng bên phải.

Sử dụng arctan2 để có được tọa độ thích hợp:

angleInRadians = Math.Atan2(((v*v) + tmp), (g*x)); 
Các vấn đề liên quan