Winkelfunktionen in C++ als Algorithmus implementieren
-
Hallo Leute,
ich bin C++ - Anfänger und will mir für die Berechnung des DOL (Distance of Lead) ein kleines Konsolentool basteln (auch zu Übungszwecken).
Die DOL ist eine Entfernung in der Luftfahrt. Sie gibt an, wie weit der Pilot von einem Flugzeug vor dem Erreichen eines Navigations - Funkfeuers vom Kurs zu eben diesem abdrehen muss, um im harmonischen Kurvenflug nach etwa wieder eben dieser Distanz vom Funkfeuer aus gemessen auf den Flugweg zu kommen, den er NACH dem besagten Funkfeuer einnehmen will. Das ist Strecken - sparsamer als über das Funkfeuer zu fliegen, dann parallel zum neuen Abflugkurs zu reisen und dann nach einiger Zeit den gewünschten Abflugkurs "anzuschneiden".
Eine geometrische Herleitung liefert folgende Beziehung
DOL = (((GS/30)*sin(beta/2)/(2*pi))/(cos(beta/2)), Ergebniseinheit sei NM (nautische Meilen).
Info: GS ist die Abkürzung für wahre Geschwindigkeit über Grund, der Wert sei gegeben und bekannt. beta sei der kleinere Winkel, der eingeschlossen wird von zwei Radien von der Flugkurve zwischen Ab- und Anflug, die senkrecht auf An- und Abflugsteuerkurs stehen. Er sei auch bekannt und gegeben.
Spezialfälle, wo der Ab/Anflugkurs vs. An/Abflugkurs diesseits / jenseits von dem Wechsel von 359° ... 360° ... 0° ... 001° liegen, sollen NOCH net berücksichtigt werden.
Lt. meinem Buch "jetzt lerne ich C++" von Markt + Technik kann man generisch in C++ nur div mod / * + - Operationen ausführen. Gestern habe ich schon mal potenzieren von ints mit ganzen Basen / Exp. realisiert, aber aus nem Mathestudium dünkt mir noch dunkel dass man sin, cos, etc. Fkt. generisch nur über komplexe Potenzreihenentwicklungen (!!) basteln kann.
Stimmt das? Wie "trigonometrisiere" ich in C++?
Mich interessiert nur der Algo, nicht das komplette Prog mit iostream using namespace blabla syntaxkrams drumherum, das mache ich schon.
THX im Voraus!
-
Wieso willst du da überhaupt generisch lösen. Es reicht, wenn du deine Winkel als double speicherst und an die Funktionen de <cmath> verfütterst.
-
kasimirle schrieb:
Mich interessiert nur der Algo, nicht das komplette Prog mit iostream using namespace blabla syntaxkrams drumherum, das mache ich schon.
Heißt das, dich interessiert auch nicht die Implementierung von Sinus/Cosinus?
Wenn dem so ist: binde <cmath> ein und du hast alles, was du brauchst. Den Rest sollte Google liefern.
Wem allerdings nicht so ist, dann wirds allerdings etwas komplexer.
-
Dafür gibts bereits fertige Funktionen in der Standartbibliothek.
http://www.cplusplus.com/reference/clibrary/cmath/sin.htmlEinfach cmath includen und dann eventuell dem Linker noch die option
-lm mitgeben.
-
Aus nem Mathestudium solltest du aber wissen, wie man Sinus & Co. berechnet!
// Sinus berechnen double Sinus(double x, int j) { double Value = 1; for (int k = j - 1; k >= 0; --k) Value = 1 - (x * x) / (((2 * k) + 2) * ((2 * k) + 3)) * Value; return (x * Value); }
-
kasimirle schrieb:
DOL = (((GS/30)*sin(beta/2)/(2*pi))/(cos(beta/2)), Ergebniseinheit sei NM (nautische Meilen).
Das kann man noch vereinfachen zu
DOL = \frac{GS\*tan(\frac{\beta}{2})}{60\*\pi}außerdem bin ich der Meinung, dass die Geschwindigkeit mit dem Quadrat eingehen muss. Wenn man Beispiele mit 200kn und 400kn rechnet, dann kommt im zweiten Fall kein 'harmonischer Kurvenflug' mehr raus.
kasimirle schrieb:
beta sei der kleinere Winkel, der eingeschlossen wird von zwei Radien von der Flugkurve zwischen Ab- und Anflug, die senkrecht auf An- und Abflugsteuerkurs stehen. Er sei auch bekannt und gegeben.
Spezialfälle, wo der Ab/Anflugkurs vs. An/Abflugkurs diesseits / jenseits von dem Wechsel von 359° ... 360° ... 0° ... 001° liegen, sollen NOCH net berücksichtigt werden.
wenn, dann schreib' Dir am besten eine eigene kleine Winkel-Klasse mit Subtraktion und Division durch einen Faktor - lohnt sich immer.
kasimirle schrieb:
Lt. meinem Buch "jetzt lerne ich C++" von Markt + Technik kann man generisch in C++ nur div mod / * + - Operationen ausführen. Gestern habe ich schon mal potenzieren von ints mit ganzen Basen / Exp. realisiert, aber aus nem Mathestudium dünkt mir noch dunkel dass man sin, cos, etc. Fkt. generisch nur über komplexe Potenzreihenentwicklungen (!!) basteln kann.
Stimmt das? Wie "trigonometrisiere" ich in C++?
brauchst Du nicht. Die anderen haben es schon erwähnt. Du musst aber berücksichtigen, dass bei den trigonometrischen Funktionen die Winkel im Bogenmaß angegeben werden müssen. Etwa so:
#include <cmath> // ... double winkel_in_grad = 30.0; // 30 Grad const double PI = std::acos( -1.0 ); const double GRAD2RAD = PI / 180.0; double tan_winkel = std::tan( winkel_in_grad * GRAD2RAD );Gruß
Werner