Excès sphérique d'un triangle
Comme nous le savons tous, la somme des angles de tout triangle plan est égale à 180 degrés.
Cependant, pour un triangle sphérique, la somme des angles est toujours supérieure à 180 degrés. La différence entre la somme des angles triangulaires sphériques et 180 degrés est appelée excès sphérique . La tâche consiste à calculer l'excès sphérique d'un triangle avec des coordonnées de sommet données.
Quelques antécédents
Un triangle sphérique est une partie de la sphère définie par trois grands cercles de la sphère.
Les deux côtés et les angles du triangle sphérique sont mesurés en terme de mesure d'angle, car chaque côté peut être considéré comme une intersection de la sphère et un angle plan avec un sommet au centre de la sphère:
Chacun des trois grands cercles distincts définit 8 triangles, mais nous ne prenons en considération que les triangles appropriés , c'est-à - dire. triangles dont l'angle et les mesures latérales satisfont
Il est pratique de définir les sommets d'un triangle en termes de système de coordonnées géographiques. Pour calculer la longueur d'un arc de sphère étant donné la longitude λ et la latitude Φ de ses extrémités, nous pouvons utiliser la formule:
, où
ou plus explicitement:
(source: https://en.wikipedia.org/wiki/Haversine_formula )
Les deux formules de base qui peuvent être utilisées pour résoudre un triangle sphérique sont:
- la loi des cosinus:
- la loi des sinus:
(source: https://en.wikipedia.org/wiki/Spherical_trigonometry#Cosine_rules_and_sine_rules )
Étant donné trois côtés, il est facile de calculer les angles à l'aide de la règle du cosinus:
Enfin, l'excès sphérique d'un triangle est défini:
Ce qui est intéressant à propos de la relation entre l'excès sphérique d'un triangle et sa surface:
Donc, sur une sphère unitaire, l'excès d'un triangle est égal à l'aire de ce triangle!
La tâche
Écrivez une fonction ou un programme qui calculera l'excès sphérique d'un triangle en degrés étant donné les coordonnées des sommets du triangle. Les coordonnées des sommets sont fournies en termes de système de coordonnées géographiques.
Chaque sommet doit être transmis sous forme [latitude in degrees][N|S][longitude in degrees][E|W]
. La longitude et E
ou W
peuvent être ignorés lorsque la latitude est de 90, c.-à-d. 90N
, 90S
, 10N100E
, 30S20W
Sont des descriptions de sommet appropriées, alors que 80N
ou 55S
ne sont pas.
Les latitudes et longitudes sont toujours entières dans les cas de test.
Les réponses avec une erreur inférieure à un degré seront acceptées (comme dans les exemples ci-dessous). Le résultat peut donc être rendu à la fois réel ou entier, à votre convenance.
Exemples
Contribution
90N0E
0N0E
0N90E
Production
89.999989
Contribution
90N
0N0E
0N90E
Production
89.999989
Contribution
0N0E
0N179E
90N0E
Production
178.998863
Contribution
10N10E
70N20W
70N40E
Production
11.969793
Dans tous les cas de test, la longitude et la latitude sont des nombres entiers. Les coordonnées de l' analyse sommet est la partie de la tâche, si un sommet doit être passé comme seule chaîne / littérale, il ne laisse passer 80N20E
que quatre paramètres / chaînes: 80
, N
, 20
, E
.
Cela garantit que les sommets sont tous distincts et que ni l'un ni l'autre des trois sommets ne forment une paire de points antipodaux.
Notation
C'est le code-golf , donc le code le plus court l'emporte.
la source
Réponses:
Matlab,
288266 octetsVoici la version commentée qui devrait expliquer ce qui se passe:
Entièrement golfé (les sauts de ligne peuvent être supprimés):
la source
Ruby, Rev 3
264255 octetsChangements majeurs:
Nouvelle constante
r
= 180 / PI définie et utilisée tout au long de la fonction.e
a dû être initialisé à + PI, donc l'excès compte maintenant vers le bas et est annulé avant de revenir.t[]
éliminé: Ruby permet d'affectert[]
directement les données qui ont été affectées àu,v,w.
i
Boucle unique pour faire le travail de deux, l'?:
opérateur ternaire bascule entre les tâches.Beaucoup d'autres changements mineurs.
Ruby, Rev 1
283277 octetsNécessite un tableau de 3 chaînes.
Aperçu
Les longueurs des côtés du triangle sur la sphère unitaire sont égales aux angles entre les vecteurs décrivant les deux points. Mais nous n'avons pas besoin de connaître cet angle. Il suffit de connaître le cosinus de l'angle, qui est facilement obtenu à partir des coordonnées cartésiennes à l'aide du produit scalaire.
Explication
Les chaînes d'entrée sont converties en une représentation sous forme de chaîne d'un tableau, qui est ensuite évaluée et stockée dans
t
, comme ci-dessous. Le zéro final n'est pas nécessaire si deux coordonnées sont données. Si seule la latitude 90 est donnée, le zéro est interprété comme la longitude.Les produits Dot sont de la forme
a.b=ax*bx+ay*by+az*bz
. Comme les vecteurs sont tous de longueur unitaire, le produit scalaire est égal au cosinus de l'angle entre les vecteurs.Afin de les calculer, une boucle est itérée 6 fois en passant deux fois dans les données d'entrée. Sur des itérations égales 0,2,4, les variables
x,y,z
sont mises à 1 pour commencer un nouveau calcul. À chaque itération, ces variables sont multipliées par les composantes x, y et z de chaque vecteur, en utilisant les données de longitude et de latitude stockées danst[0],t[1]
(qui, pour des raisons de golf, sont également affectéesu,v
). La somme des variables est écrite dans un tableaun
(les valeurs de poubelle sur les itérations paires étant écrasées par les valeurs correctes sur les itérations impaires) afin qu'à la finn
contienne les 3 produits scalaires[a.b, c.a, b.c]
.Pour la règle du cosinus, nous avons besoin des cosinus des trois angles inclus entre les sommets, mais nous avons également besoin des sinus. Ceux-ci sont obtenus comme
sqrt(1-cosine**2)
. Lorsque les sinus sont multipliés, l'expression peut être réorganisée de sorte qu'un seul appel àsqrt
soit requis. Le fait que nous ne sachions pas si le sinus était positif ou négatif n'a pas d'importance, car la formule haversine donne toujours le sinus positif de toute façon. La grandeur physique importante est la distance entre les points, qui est absolue et donc toujours positive.Pour chaque itération
i=0..2
, nous calculons la valeur de l'élément de tableau opposé à l'angle eni-1
utilisant les autres élémentsi
eti-2
. Les indices de tableau négatifs comme celui-ci sont légaux dans Ruby, ils se terminent juste au début du tableau.Non testé dans le programme de test
Nécessite trois ensembles de coordonnées sur la même ligne, avec des espaces entre eux.
la source