Kugelförmiger Überschuss eines Dreiecks
Wie wir alle wissen, beträgt die Winkelsumme eines ebenen Dreiecks 180 Grad.
Bei einem sphärischen Dreieck ist die Winkelsumme jedoch immer größer als 180 Grad. Die Differenz zwischen der Summe der sphärischen Dreieckswinkel und 180 Grad wird als sphärischer Überschuss bezeichnet . Die Aufgabe besteht darin, den sphärischen Überschuss eines Dreiecks mit gegebenen Scheitelpunktkoordinaten zu berechnen.
Etwas Hintergrund
Ein sphärisches Dreieck ist ein Teil der Kugel, der durch drei große Kreise der Kugel definiert wird.
Beide Seiten und Winkel des sphärischen Dreiecks werden als Winkelmaß gemessen, da jede Seite als Schnittpunkt der Kugel mit einem planaren Winkel mit dem Scheitelpunkt in der Mitte der Kugel betrachtet werden kann:
Jeweils drei verschiedene Großkreise definieren 8 Dreiecke, aber wir berücksichtigen nur die richtigen Dreiecke , d. H. Dreiecke, deren Winkel und Seitenmaße genügen
Es ist praktisch, Eckpunkte eines Dreiecks als geografisches Koordinatensystem zu definieren. Um die Länge eines Kugelbogens bei gegebener Länge λ und Breite Φ seiner Enden zu berechnen, können wir die Formel verwenden:
, wo
oder genauer gesagt:
(Quelle: https://en.wikipedia.org/wiki/Haversine_formula )
Die zwei Grundformeln, die zum Lösen eines sphärischen Dreiecks verwendet werden können, sind:
- das Gesetz der Cosinus:
- das Gesetz der Sinus:
(Quelle: https://en.wikipedia.org/wiki/Spherical_trigonometry#Cosine_rules_and_sine_rules )
Bei drei gegebenen Seiten ist es einfach, die Winkel unter Verwendung der Kosinusregel zu berechnen:
Schließlich wird der kugelförmige Überschuss eines Dreiecks definiert:
Was ist interessant an der Beziehung zwischen dem sphärischen Überschuss eines Dreiecks und seiner Fläche:
Auf einer Einheitskugel entspricht der Überschuss eines Dreiecks der Fläche dieses Dreiecks!
Die Aufgabe
Schreiben Sie eine Funktion oder ein Programm, das den sphärischen Überschuss eines Dreiecks in Grad berechnet, wenn die Eckpunktkoordinaten des Dreiecks gegeben sind. Die Scheitelpunktkoordinaten werden als geografisches Koordinatensystem angegeben.
Jeder Eckpunkt sollte in Form übergeben werden [latitude in degrees][N|S][longitude in degrees][E|W]
. Längengrad und E
oder W
können übersprungen werden, wenn der Breitengrad 90 ist . 90N
, 90S
, 10N100E
, 30S20W
Sind richtige Vertex Beschreibungen, während 80N
oder 55S
nicht sind.
Die Breiten- und Längengrade sind in den Testfällen immer ganzzahlig.
Die Antworten mit einem Fehler von weniger als einem Grad werden akzeptiert (wie in den folgenden Beispielen). Das Ergebnis kann daher je nach Bedarf sowohl als reelle als auch als ganze Zahl dargestellt werden.
Beispiele
Eingang
90N0E
0N0E
0N90E
Ausgabe
89.999989
Eingang
90N
0N0E
0N90E
Ausgabe
89.999989
Eingang
0N0E
0N179E
90N0E
Ausgabe
178.998863
Eingang
10N10E
70N20W
70N40E
Ausgabe
11.969793
In allen Testfällen sind Längen- und Breitengrad ganze Zahlen. Parsen der Vertex - Koordinaten der Teil der Aufgabe ist es , so eine Ecke muss als Einzelsaite / wörtliche weitergegeben wird, ist es nicht erlaubt passieren 80N20E
als vier Parameter / Strings: 80
, N
, 20
, E
.
Dies stellt sicher, dass alle Scheitelpunkte unterschiedlich sind und keiner der drei Scheitelpunkte ein antipodales Punktpaar bildet.
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code.
quelle
Antworten:
Matlab,
288266 BytesHier die kommentierte Version, die erklären soll, was los ist:
Vollgolf (Zeilenumbrüche können entfernt werden):
quelle
Ruby, Rev 3
264255 BytesWesentliche Änderungen:
Neue Konstante
r
= 180 / PI definiert und in der gesamten Funktion verwendet.e
Musste auf + PI initialisiert werden, so zählt Überschuss jetzt abwärts und wird vor der Rückkehr negiert.t[]
eliminiert: Ruby ermöglicht diet[]
direkte Zuordnung der Daten, denen zugewiesen wurdeu,v,w.
Einzelschleife
i
für die Ausführung von zwei?:
ternären Bedienern, die zwischen Aufgaben wechseln.Viele andere kleine Änderungen.
Ruby, Rev 1
283277 BytesBenötigt ein Array von 3 Zeichenfolgen.
Überblick
Die Längen der Dreieckseiten auf der Einheitskugel entsprechen den Winkeln zwischen den Vektoren, die die beiden Punkte beschreiben. Aber diesen Winkel brauchen wir nicht zu kennen. Es genügt, den Kosinus des Winkels zu kennen, der mit dem Skalarprodukt leicht aus kartesischen Koordinaten ermittelt werden kann.
Erläuterung
Die Eingabezeichenfolgen werden in eine Zeichenfolgendarstellung eines Arrays konvertiert, das dann wie folgt ausgewertet und gespeichert
t
wird. Die endgültige Null wird nicht benötigt, wenn zwei Koordinaten angegeben sind. Wenn nur der Breitengrad 90 angegeben ist, wird die Null als Längengrad interpretiert.Die Dot-Produkte haben die Form
a.b=ax*bx+ay*by+az*bz
. Da die Vektoren alle eine Einheitslänge haben, ist das Punktprodukt gleich dem Kosinus des Winkels zwischen den Vektoren.Um sie zu berechnen, wird eine Schleife sechsmal durchlaufen, wobei zweimal die Eingabedaten durchlaufen werden. Bei den geraden Iterationen 0,2,4 werden die Variablen
x,y,z
auf 1 gesetzt, um eine neue Berechnung zu starten. Bei jeder Iteration werden diese Variablen mit den x-, y- und z-Komponenten jedes Vektors multipliziert, wobei die in gespeicherten Längen- und Breitengraddaten verwendet werdent[0],t[1]
(denen aus Golfgründen auch zugewiesen wirdu,v
). Die Summe der Variablen wird in das Array geschriebenn
(die Abfallwerte bei geraden Iterationen werden durch die korrekten Werte bei ungeraden Iterationen überschrieben), sodass am Enden
die 3 Punktprodukte enthalten sind[a.b, c.a, b.c]
.Für die Cosinusregel benötigen wir den Cosinus der drei eingeschlossenen Winkel zwischen Eckpunkten, aber wir benötigen auch den Sinus. Diese werden erhalten als
sqrt(1-cosine**2)
. Wenn die Sinusse multipliziert werden, kann der Ausdruck neu angeordnet werden, sodass nur ein Aufruf vonsqrt
erforderlich ist. Die Tatsache, dass wir nicht wissen, ob der Sinus positiv oder negativ war, spielt keine Rolle, da die Haversinusformel sowieso immer den positiven Sinus ergibt. Die wichtige physikalische Größe ist der Abstand zwischen den Punkten, der absolut und daher immer positiv ist.Für jede Iteration
i=0..2
berechnen wir den Wert für das gegenüberliegende Array-Elementi-1
mit den anderen Elementeni
undi-2
. Negative Array-Indizes wie dieses sind in Ruby zulässig. Sie werden nur an den Anfang des Arrays umgebrochen.Ungolfed im Testprogramm
Erfordert drei Koordinatensätze auf derselben Linie mit Leerzeichen dazwischen.
quelle