C++ :: Aufgabe #317
1 Lösung

Landeablage Fallschirmspringer
Fortgeschrittener - C++
von JKooP
- 16.11.2020 um 12:34 Uhr
Fallschirmspringer versuchen stets ihre vorgegebene Landezone (rot) zu treffen. Dennoch kommt es häufiger vor, dass aufgrund von unvorhergesehenen Einflüssen wie Scher- und Bodenwinde diese auch mal verfehlt wird (blau, orange, grün). Landeablagen, die radial einen Wert größer als 100m haben müssen dokumentiert werden. Dabei werden die Entfernung und die Richtung zum Soll- Ziel ermittelt. Die Koordinate (UTM) der Soll-Landezone ist bekannt.
Der Ist- Landepunkt wird mit einem GPS- Modul als Koordinate im UTM- Verfahren (WGS-84) ermittelt. Die Skizze im Anhang soll dies verdeutlichen.
Beispielkoordinate:
Ost: 374200
3: 100km- Quadrat
74200: Angabe in Meter -> 74200m (für Berechnung wichtig)
Nord: 5500150
55: 100km- Quadrat
00150: Angabe in Meter -> 150m (für Berechnung wichtig)
UTM: 374200 5500150
Beispiel zur Berechnung:
Soll- Koordinate: [Ost: 383000, Nord: 5500010]
Ist- Koordinate: [Ost: 383320, Nord: 5500220]
Wie groß sind die Landeablage in Meter und die Richtungsablage in Grad zu geografisch Nord?
Schreibe ein Programm, mit dem es möglich ist, jegliche Ablage in beliebige Richtung zu bestimmen.
Der Ist- Landepunkt wird mit einem GPS- Modul als Koordinate im UTM- Verfahren (WGS-84) ermittelt. Die Skizze im Anhang soll dies verdeutlichen.
Beispielkoordinate:
Ost: 374200
3: 100km- Quadrat
74200: Angabe in Meter -> 74200m (für Berechnung wichtig)
Nord: 5500150
55: 100km- Quadrat
00150: Angabe in Meter -> 150m (für Berechnung wichtig)
UTM: 374200 5500150
Beispiel zur Berechnung:
Soll- Koordinate: [Ost: 383000, Nord: 5500010]
Ist- Koordinate: [Ost: 383320, Nord: 5500220]
Wie groß sind die Landeablage in Meter und die Richtungsablage in Grad zu geografisch Nord?
Schreibe ein Programm, mit dem es möglich ist, jegliche Ablage in beliebige Richtung zu bestimmen.
Lösungen:
C++ 11
DropZoneDiff.main
C-Code
DropZoneDiff.h
C-Code
DropZoneDiff.cpp
C-Code
DropZoneDiff.main

#include "DropZoneDiff.h" #include <iomanip> #include <iostream> using namespace std; int main() { Coordinate target{ 383000, 5500010 }; Coordinate actual{ 383320, 5500220 }; DropZoneDiff diff{ { target, actual } }; cout.setf(ios::fixed); cout << setprecision(1); locale::global(locale("German_germany.UTF-8")); cout << "Die Ablage beträgt " << diff.get_distance() << "m und " << diff.get_angle() << "°" << endl; }
DropZoneDiff.h

#pragma once struct Coordinate { int E; int N; }; struct PairOfCoordinates { Coordinate Target; Coordinate Actual; }; enum class Quad { I = 90, II = 180, III = 270, IV = 360 }; class DropZoneDiff { public: DropZoneDiff(PairOfCoordinates pair) { m_pair = pair; }; double get_distance(); double get_angle(); private: const double pi = 3.14159265359; PairOfCoordinates m_pair; Quad get_quadrant(); };
DropZoneDiff.cpp

#include "DropZoneDiff.h" #include <string> using namespace std; double DropZoneDiff::get_distance() { return sqrt(pow(abs(m_pair.Target.E - m_pair.Actual.E), 2) + pow(abs(m_pair.Target.N - m_pair.Actual.N), 2)); } Quad DropZoneDiff::get_quadrant() { auto e = m_pair.Actual.E > m_pair.Target.E; auto n = m_pair.Actual.N > m_pair.Target.N; if (e == true && n == true) return Quad::I; else if (e == true && n == false) return Quad::II; else if (e == false && n == false) return Quad::III; else return Quad::IV; } double DropZoneDiff::get_angle() { return (int)get_quadrant() - atan2(abs(m_pair.Target.N - m_pair.Actual.N), abs(m_pair.Target.E - m_pair.Actual.E)) * 180 / pi; }