Vektoren
← elektronische Abgabe | ● | elektronische Abgabe →
Aufgabe “Operator-Overloading”:
a) Implementieren Sie analog zu den komplexen Zahlen aus dem Script eine Klasse Vector3D
in einem Header “Vector3d.h”. Die Klasse soll die passenden Konstruktoren und Operatoren (+ - * und <<) für einen 3D-Vektor anbieten.
Damit soll folgender Testcode lauffähig sein:
Vector3D a(1,1,1), b(2,0,0);
Vector3D c=(a+b)*(a*b);
cout << (a+b) << "*" << (a*b) << " = " << c << endl;
Das richtige Ergebnis der Ausgabe obigen Testcodes lautet: (3,1,1)*2 = (6,2,2)
Beachten Sie:
- Die Operatoren
+
und-
besitzen zwei Vektoren als links- und rechtsseitigen Operanden.- Das Ergebnis ergibt sich durch komponentenweise Addition. bzw. Subtraktion.
- z.B. $ \vec{ a }+\vec{ b } = (a_x + b_x, a_y + b_y, a_z + b_z)^T $
- Der
*
-Operator besitzt einen Vektor als links- und einen Skalar (double) als rechtsseitigen Operanden, oder umgekehrt.- Der Skalarwert wird jeweils an alle Komponenten heranmultipliziert.
- z.B. $\vec{ a }*b = (a_x b, a_y b, a_z b)^T $
- bzw. $a*\vec{ b } = (a b_x, a b_y, a b_z)^T $
- Ein links- und rechtsseitiger Vektor als Operand des
*
-Operators entspricht dem dem sog. Skalarprodukt.- $\vec{ a }*\vec{ b } = a_x b_x + a_y b_y + a_z b_z $
b) Bestimmen Sie mit Hilfe der Vector3D
-Klasse den geografischen Abstand von Nürnberg und Ansbach!
- Die geografischen 3D Koordinaten von Orten sind als sogenannte Lat/Lon-Koordinaten gegeben (Latitude = Breitengrad, Longitude = Längengrad):
- Nürnberg: lat=49.45, lon=11.07
- Ansbach: lat=49.26, lon=10.59
- Um eine Abstandsmessung vornehmen zu können, müssen die Polarkoordinaten des geographischen Koordinatensystems in ein metrisches (kartesisches) Koordinatensystem umgerechnet werden. Ein geeignetes System ist das sogenannte ECEF Koordinatensystem. In der Illustration rechts sind die Achsen des ECEF-Koordinatensystems mit x,y,z und der Längengrad mit $\lambda$ bezeichnet. Die geographische Breite am Äquator ist 0. Ebenso ist die geographische Länge auf dem Greenwich-Meridian 0. Am Äquator ist die z-Koordinate des ECEF-Systems ebenfalls 0.
Es gilt folgende (näherungsweise) Umrechnungsfunktion von Lat/Lon nach ECEF:
{
double rlat=lat*2*M_PI/360;
double rlon=lon*2*M_PI/360;
double slat=sin(rlat);
double clat=cos(rlat);
double slon=sin(rlon);
double clon=cos(rlon);
double r=6371000;
return(Vector3D(r*clat*clon, r*clat*slon, r*slat));
}
Implementieren Sie dies als statische Methode der Vektor Klasse!
Damit ergibt sich der Abstand (Luftlinie) von zwei Orten aus der Länge des Differenzvektors der zwei entsprechenden ECEF Ortskoordinaten.
D.h. der Abstand $d(\vec{ a },\vec{ b }) = |\vec{ a }-\vec{ b }|$, mit $|\vec{ v }| = \sqrt{\vec{ v }*\vec{ v }}$.
Kontrolle: Der gesuchte Abstand beträgt etwa 40km.
Nebenbemerkung: Die exakte Abstandsberechnung im Sinne der kürzesten geraden Wegstrecke zwischen zwei Punkten auf der Erdoberfläche erfordert die Längenberechnung eines Abschnitts auf dem sog. Orthodrom (Großkreis). Dies wird erschwert dadurch, dass die Erde keine exakte Kugel ist und Großkreise daher Ellipsenform haben.
Zusatzaufgaben:
c) Versuchen Sie die Entfernung von Paris und München zu bestimmen.
d) Und die Entfernung von Muggendorf und Schneitzlreuth.
d) Eventuell die Entfernung von Daheim (Kreis Dreisbach) nach Nordpol (Kreis Osterhever).
d) Und vielleicht noch die Entfernung von Timbuktu (Mecklenburg-Vorpommern) und Honolulu (Westrhein-Nordfalen).
d) Von untergeordnetem Interesse ist dagegen die Entfernung von Hanfgarten (Kreis Gummersbach) zu Drogen (in Thüringen).