Kulisty nadmiar trójkąta
Jak wszyscy wiemy, suma kątów dowolnego płaskiego trójkąta jest równa 180 stopni.
Jednak w przypadku trójkąta sferycznego suma kątów jest zawsze większa niż 180 stopni. Różnica między sumą kątów sferycznych trójkątów a 180 stopni nazywa się nadwyżką sferyczną . Zadanie polega na obliczeniu sferycznego nadmiaru trójkąta z podanymi współrzędnymi wierzchołków.
Trochę tła
Trójkąt sferyczny jest częścią kuli wyznaczoną przez trzy wielkie koła kuli.
Zarówno boki, jak i kąty trójkąta sferycznego są mierzone jako miara kąta, ponieważ każdy bok można uznać za przecięcie kuli i pewien kąt płaski z wierzchołkiem w środku kuli:
Każde trzy odrębne wielkie koła definiują 8 trójkątów, ale bierzemy pod uwagę tylko właściwe trójkąty , tj. trójkąty, których kąt i wymiary boczne są spełnione
Wygodnie jest zdefiniować wierzchołki trójkąta pod względem geograficznego układu współrzędnych. Aby obliczyć długość łuku kuli, biorąc pod uwagę długość λ i szerokość geograficzną Φ jego końców, możemy użyć wzoru:
, gdzie
lub bardziej szczegółowo:
(źródło: https://en.wikipedia.org/wiki/Haversine_formula )
Dwie podstawowe formuły, których można użyć do rozwiązania trójkąta sferycznego, to:
- prawo cosinusów:
- prawo sinusów:
(źródło: https://en.wikipedia.org/wiki/Spherical_trigonometry#Cosine_rules_and_sine_rules )
Biorąc pod uwagę trzy strony, łatwo jest obliczyć kąty za pomocą reguły cosinus:
Na koniec określa się kulisty nadmiar trójkąta:
Co ciekawe w związku między sferycznym nadmiarem trójkąta a jego obszarem:
Zatem na kuli jednostkowej nadmiar trójkąta jest równy powierzchni tego trójkąta!
Zadanie
Napisz funkcję lub program, który oblicza sferyczny nadmiar trójkąta w stopniach, biorąc pod uwagę współrzędne wierzchołków trójkąta. Współrzędne wierzchołków podano w układzie współrzędnych geograficznych.
Każdy wierzchołek należy przekazać w formie [latitude in degrees][N|S][longitude in degrees][E|W]
. Długość geograficzna i E
lub W
może zostać pominięta, gdy szerokość wynosi 90, tj. 90N
, 90S
, 10N100E
, 30S20W
Są odpowiednie opisy wierzchołków, natomiast 80N
czy 55S
nie.
Szerokość i długość geograficzna są zawsze liczbami całkowitymi w przypadkach testowych.
Odpowiedzi z błędem mniejszym niż jeden stopień zostaną zaakceptowane (jak w przykładach poniżej). Wynik może być zatem renderowany jako rzeczywisty lub całkowity, dla wygody użytkownika.
Przykłady
Wejście
90N0E
0N0E
0N90E
Wynik
89.999989
Wejście
90N
0N0E
0N90E
Wynik
89.999989
Wejście
0N0E
0N179E
90N0E
Wynik
178.998863
Wejście
10N10E
70N20W
70N40E
Wynik
11.969793
We wszystkich przypadkach testowych długość i szerokość geograficzna są liczbami całkowitymi. Parsowania współrzędne wierzchołków jest częścią zadania, więc wierzchołek musi być przekazany jako jeden ciąg / dosłowny, nie wolno przechodzić 80N20E
jak cztery parametry / strun: 80
, N
, 20
, E
.
Gwarantuje to, że wszystkie wierzchołki są różne i żadne z trzech z trzech wierzchołków nie tworzy pary punktów antypodalnych.
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod.
źródło
Odpowiedzi:
Matlab,
288266 bajtówOto skomentowana wersja, która powinna wyjaśniać, co się dzieje:
W pełni golfowy (łamanie linii można usunąć):
źródło
Ruby, Rev 3
264255 bajtówGłówne zmiany:
Nowa stała
r
= 180 / PI zdefiniowana i używana w całej funkcji.e
musiał zostać zainicjowany na + PI, więc nadmiar odlicza się teraz w dół i jest negowany przed powrotem.t[]
wyeliminowane: Ruby pozwalat[]
bezpośrednio przypisać dane, które zostały przypisaneu,v,w.
Pojedyncza
i
pętla do wykonania zadania dwóch?:
trójskładnikowych operatorów przełącza między zadaniami.Wiele innych drobnych zmian.
Ruby, Rev 1
283277 bajtówWymaga tablicy 3 ciągów.
Przegląd
Długości boków trójkąta na kuli jednostkowej są równe kątom między wektorami opisującymi dwa punkty. Ale nie musimy znać tego kąta. Wystarczy znać cosinus kąta, który można łatwo uzyskać ze współrzędnych kartezjańskich za pomocą iloczynu punktowego.
Wyjaśnienie
Ciągi wejściowe są konwertowane na ciąg znaków reprezentujący tablicę, która jest następnie analizowana i przechowywana
t
, jak poniżej. Ostatnie zero nie jest potrzebne, jeśli podano dwie współrzędne. Jeśli podana jest tylko szerokość geograficzna 90, zero jest interpretowane jako długość geograficzna.Produkty Dot mają formę
a.b=ax*bx+ay*by+az*bz
. Ponieważ wszystkie wektory mają długość jednostkową, iloczyn skalarny jest równy cosinusowi kąta między wektorami.Aby je obliczyć, pętla jest iterowana 6 razy, przechodząc dwukrotnie przez dane wejściowe. Nawet w iteracjach 0,2,4 zmienne
x,y,z
są ustawione na 1, aby rozpocząć nowe obliczenia. Podczas każdej iteracji zmienne te są mnożone przez składowe x, y i z każdego wektora, z wykorzystaniem danych długości i szerokości geograficznej przechowywanych wt[0],t[1]
(do których również przypisano golfau,v
). Suma zmiennych jest zapisywana do tablicyn
(wartości śmieci w parzystych iteracjach są zastępowane poprawnymi wartościami w nieparzystych iteracjach), tak aby na końcun
zawierały produkty 3 kropkowe[a.b, c.a, b.c]
.Aby zastosować regułę cosinus, potrzebujemy cosinus trzech zawartych kątów między wierzchołkami, ale potrzebujemy również sinusów. Są one uzyskiwane jako
sqrt(1-cosine**2)
. W miarę mnożenia sinusów wyrażenie można zmienić, tak abysqrt
wymagane było tylko jedno wywołanie . Fakt, że nie wiemy, czy sinus był dodatni czy ujemny, nie ma znaczenia, ponieważ formuła haverine i tak zawsze daje sinus dodatni. Ważną wielkością fizyczną jest odległość między punktami, która jest absolutna, a zatem zawsze dodatnia.Dla każdej iteracji
i=0..2
obliczamy wartość kąta przeciwnego elementu tablicy,i-1
używając innych elementówi
ii-2
. Takie ujemne indeksy tablicowe takie jak ten są dozwolone w Rubim, po prostu zawijają się na początek tablicy.Niegolfowany w programie testowym
Wymaga trzech zestawów współrzędnych na tej samej linii, z odstępami między nimi.
źródło