2017-08-01 2 views
5

Ich möchte einige 3D-Flugbahndaten für eine Flugzeugsimulation generieren. Die Idee ist, dass das Flugzeug an einem bestimmten Ort startet x und weiterhin mit einer durchschnittlichen Aufstiegsgeschwindigkeit a_v und Winkel a_theta aufsteigen, bis es eine maximale Höhe m_a erreicht. Das Flugzeug würde dann an seinem m_a fortfahren, bis es eine bestimmte Entfernung d_d von seinem Bestimmungsort erreicht, an welchem ​​Punkt es seinen Abstieg in einem Winkel d_theta mit einer durchschnittlichen Abstiegsgeschwindigkeit von d_v beginnen wird. Schließlich landet das Flugzeug am Zielort y.Funktion zum Erzeugen der Flugbahn (Liste der 3D-Punkte, lat, lon, alt)

Ich möchte, dass die Funktion eine Liste von 3D-Punkten zurückgibt.

Ich freue mich, dies entweder in Python (bevorzugt) oder C# zu implementieren.

Zur Veranschaulichung:

enter image description here

Wer weiß, wie ich das erreichen kann? Gibt es vielleicht ein Open-Source-Projekt, das das tut? Ich habe schon eine Weile gesucht, aber nichts gefunden.

+0

Wo ist das Problem?Für das Diagramm, das Sie gezeigt haben, sollten 'cos',' sin', 'sqrt' und' ** 2' alles sein, was Sie zusätzlich zu '+ - * /' brauchen. Versuchen Sie, das Problem zuerst in 2D zu lösen (wie gezeigt) und die Koordinaten in sphärisch zu konvertieren. Wenn Sie nur eine Bahn mit 3D-Punkten benötigen, sollte die Geschwindigkeit nicht relevant sein. –

+0

Kann das Flugzeug in beliebiger Höhe landen/starten? – meowgoesthedog

+0

@meowgoesthedog Nun, ich nehme an, wenn ich die Höhen von Flughafen A und B hätte, dann ja. Es wäre schön, dies zu berücksichtigen. – pookie

Antwort

0

empfehle ich Ihnen, das Problem in zwei unabhängigen Schritten zu lösen, so dass das Flugzeug nicht durch den Boden hindurchgeht:

  1. Berechnen Sie den Pfad auf der Oberfläche einer Kugel.
  2. Interpolieren Sie die Höhe entlang dieses Pfades.

Für 1. können Sie die spherical interpolation techniques on Quaternions verwenden.

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

Sie haben keinen Code geschrieben, also werde ich auch keinen schreiben. Python mit math Paket ist mehr als genug, um dieses Problem zu lösen.

Erforderliche Schritte:

  • Das Flugzeug auf einem great circle fliegen sollte. Das heißt, Sie benötigen nur one distance, um X und Y zu beschreiben.
  • Sie könnten den Ursprung an X setzen und Y mit einem Breitengrad angeben.
  • Berechnen Sie die Tangente der Erde bei X, und drehen Sie um a_theta. Finde den Punkt, an dem es m_a Höhe erreicht.
  • Berechnen Sie die Tangente der Erde bei Y, und drehen Sie um d_theta. Finde den Punkt, an dem es m_a Höhe erreicht.
  • Zeichnen Sie einen Bogen zwischen den beiden vorherigen Punkten, mit einem Radius von EarthRadius + m_a
  • Jede Koordinate ist in der 2D des Großkreises bekannt, Sie müssen nur sie zurück zu 3D-Koordinaten drehen.

Eine Liste der 3D-Punkte, brauchen Sie auch nicht a_v, d_v oder d_d.