2017-08-01 14 views
5

Tôi đang tìm cách tạo ra một số dữ liệu quỹ đạo 3D cho mô phỏng máy bay. Ý tưởng là máy bay cất cánh tại một số địa điểm x và tiếp tục bay lên ở một số vận tốc bay trung bình a_v và góc a_theta cho đến khi đạt đến độ cao tối đa m_a. Máy bay sau đó sẽ tiếp tục tại m_a của nó cho đến khi nó đạt đến một khoảng cách nhất định d_d từ điểm đến của nó, tại thời điểm đó nó sẽ bắt đầu gốc tại một số góc d_theta với vận tốc gốc trung bình là d_v. Cuối cùng, máy bay hạ cánh tại điểm đến y.Chức năng tạo quỹ đạo bay (danh sách các điểm 3D, lat, lon, alt)

Tôi muốn hàm trả về danh sách các điểm 3D.

Tôi đang tìm cách triển khai điều này bằng Python (ưa thích) hoặc C#.

Đối với mục đích minh họa:

enter image description here

Có ai biết làm thế nào tôi có thể đạt được điều này? Có lẽ có một số dự án mã nguồn mở thực hiện điều này? Tôi đã tìm kiếm một lúc rồi, nhưng không tìm thấy gì cả.

+0

Vậy vấn đề ở đâu?Đối với sơ đồ bạn đã hiển thị, 'cos',' sin', 'sqrt' và' ** 2' phải là tất cả những gì bạn cần ngoài '+ - * /'. Cố gắng giải quyết vấn đề trong 2D trước (như được hiển thị) và chuyển đổi tọa độ thành hình cầu. Ngoài ra, nếu bạn chỉ cần một quỹ đạo với các điểm 3D, vận tốc sẽ không liên quan. –

+0

Máy bay có thể hạ cánh/cất cánh ở bất kỳ độ cao nào không? – meowgoesthedog

+0

@meowgoesthedog Vâng, tôi cho rằng nếu tôi có độ cao của sân bay A và B, thì có. Nó sẽ được tốt đẹp để có mà xem xét. – pookie

Trả lời

0

tôi khuyên bạn nên giải quyết vấn đề theo 2 bước độc lập để các máy bay không đi qua mặt đất:

  1. Tính con đường trên bề mặt của một hình cầu.
  2. Nội suy chiều cao dọc theo đường dẫn này.

Đối với 1. bạn có thể sử dụng spherical interpolation techniques on Quaternions.

Quaternion slerp(Quaternion v0, Quaternion v1, double t) { 
    // Only unit quaternions are valid rotations. 
    // Normalize to avoid undefined behavior. 
    v0.normalize(); 
    v1.normalize(); 

    // Compute the cosine of the angle between the two vectors. 
    double dot = dot_product(v0, v1); 

    const double DOT_THRESHOLD = 0.9995; 
    if (fabs(dot) > DOT_THRESHOLD) { 
     // If the inputs are too close for comfort, linearly interpolate 
     // and normalize the result. 

     Quaternion result = v0 + t*(v1 – v0); 
     result.normalize(); 
     return result; 
    } 

    // If the dot product is negative, the quaternions 
    // have opposite handed-ness and slerp won't take 
    // the shorter path. Fix by reversing one quaternion. 
    if (dot < 0.0f) { 
     v1 = -v1; 
     dot = -dot; 
    } 

    Clamp(dot, -1, 1);   // Robustness: Stay within domain of acos() 
    double theta_0 = acos(dot); // theta_0 = angle between input vectors 
    double theta = theta_0*t; // theta = angle between v0 and result 

    Quaternion v2 = v1 – v0*dot; 
    v2.normalize();    // { v0, v2 } is now an orthonormal basis 

    return v0*cos(theta) + v2*sin(theta); 
} 
0

Bạn không viết bất kỳ mã nào, vì vậy tôi sẽ không viết bất kỳ mã nào. Python với gói math là quá đủ để giải quyết vấn đề này.

bước bắt buộc:

  • Chiếc máy bay nên bay trên great circle. Điều này có nghĩa là bạn chỉ cần one distance để mô tả X và Y.
  • Bạn có thể đặt nguồn gốc tại X và chỉ định Y có vĩ độ.
  • Tính toán ốp của Trái đất tại X và xoay theo a_theta. Tìm điểm đạt đến độ cao m_a.
  • Tính độ tiếp tuyến của Trái đất tại Y và xoay theo d_theta. Tìm điểm đạt đến độ cao m_a.
  • Vẽ một vòng cung giữa hai điểm trước đó, với bán kính EarthRadius + m_a
  • Mọi tọa độ được biết trong 2D của vòng tròn lớn, bạn chỉ cần xoay chúng trở lại tọa độ 3D.

Để biết danh sách các điểm 3D, bạn không cần a_v, d_v hoặc d_d.

Các vấn đề liên quan