Exceso esférico de un triángulo
Como todos sabemos, la suma de los ángulos de cualquier triángulo plano es igual a 180 grados.
Sin embargo, para un triángulo esférico, la suma de los ángulos siempre es mayor que 180 grados. La diferencia entre la suma de los ángulos del triángulo esférico y 180 grados se llama exceso esférico . La tarea es calcular el exceso esférico de un triángulo con coordenadas de vértice dadas.
Algunos antecedentes
Un triángulo esférico es una parte de la esfera definida por tres grandes círculos de la esfera.
Tanto los lados como los ángulos del triángulo esférico se miden en el término de la medida del ángulo, porque cada lado puede considerarse como una intersección de la esfera y un ángulo plano con vértice en el centro de la esfera:
Cada tres círculos grandes distintos definen 8 triángulos, pero solo tomamos en cuenta los triángulos apropiados , es decir. triángulos cuyo ángulo y medidas laterales satisfacen
Es conveniente definir los vértices de un triángulo en términos de sistema de coordenadas geográficas. Para calcular la longitud de un arco de esfera dada la longitud λ y la latitud Φ de sus extremos, podemos usar la fórmula:
, dónde
o más explícitamente:
(fuente: https://en.wikipedia.org/wiki/Haversine_formula )
Las dos fórmulas básicas que se pueden usar para resolver un triángulo esférico son:
- la ley de cosenos:
- la ley de los senos
(fuente: https://en.wikipedia.org/wiki/Spherical_trigonometry#Cosine_rules_and_sine_rules )
Dados tres lados, es fácil calcular los ángulos usando la regla del coseno:
Finalmente, se define el exceso esférico de un triángulo:
Lo interesante de la relación entre el exceso esférico de un triángulo y su área:
Entonces, en una esfera unitaria, ¡el exceso de un triángulo es igual al área de ese triángulo!
La tarea
Escriba una función o un programa que calcule el exceso esférico de un triángulo en grados, dadas las coordenadas de los vértices del triángulo. Las coordenadas de vértice se proporcionan en términos de sistema de coordenadas geográficas.
Cada vértice debe pasarse en forma [latitude in degrees][N|S][longitude in degrees][E|W]
. La longitud y / E
o W
se pueden omitir cuando la latitud es 90, es decir. 90N
, 90S
, 10N100E
, 30S20W
Son descripciones adecuadas de vértices, mientras que 80N
, o 55S
no lo son.
Las latitudes y longitudes son siempre enteras en los casos de prueba.
Se aceptarán las respuestas con un error inferior a un grado (como en los ejemplos a continuación). El resultado puede representarse como real o entero, por lo tanto, según su conveniencia.
Ejemplos
Entrada
90N0E
0N0E
0N90E
Salida
89.999989
Entrada
90N
0N0E
0N90E
Salida
89.999989
Entrada
0N0E
0N179E
90N0E
Salida
178.998863
Entrada
10N10E
70N20W
70N40E
Salida
11.969793
En todos los casos de prueba, longitud y latitud son números enteros. Analizar las coordenadas de los vértices es la parte de la tarea, por lo que un vértice debe pasar como cuerda suelta / literal, no está permitido pasar 80N20E
como cuatro parámetros: / cuerdas 80
, N
, 20
, E
.
Esto garantiza que los vértices son todos distintos y ninguno de los tres vértices forma un par de puntos antipodales.
Puntuación
Este es el código de golf , por lo que gana el código más corto.
fuente
Respuestas:
Matlab,
288266 bytesAquí la versión comentada que debería explicar lo que está sucediendo:
Completamente golfizado (se pueden eliminar los saltos de línea):
fuente
Ruby, Rev 3
264255 bytesCambios principales:
Nueva constante
r
= 180 / PI definida y utilizada en toda la función.e
tuvo que ser inicializado a + PI, por lo que el exceso ahora cuenta hacia abajo y se niega antes de regresar.t[]
eliminado: Ruby permite los datos que se asignaron at[]
directamente au,v,w.
Soltero
i
bucle para hacer el trabajo de dos?:
operadores ternarios cambia entre tareas.Muchos otros cambios menores.
Ruby, Rev 1
283277 bytesRequiere una matriz de 3 cuerdas.
Visión general
Las longitudes de los lados del triángulo en la esfera de la unidad son iguales a los ángulos entre los vectores que describen los dos puntos. Pero no necesitamos saber ese ángulo. Es suficiente conocer el coseno del ángulo, que se obtiene fácilmente de las coordenadas cartesianas utilizando el Producto Dot.
Explicación
Las cadenas de entrada se convierten en una representación de cadena de una matriz, que luego se evalúa y almacena
t
como se muestra a continuación. El cero final no es necesario si se dan dos coordenadas. Si solo se da la latitud 90, el cero se interpreta como la longitud.Los productos Dot son de la forma
a.b=ax*bx+ay*by+az*bz
. Como los vectores son todos de longitud unitaria, el producto escalar es igual al coseno del ángulo entre los vectores.Para calcularlos, se itera un bucle 6 veces, pasando dos veces por los datos de entrada. En las iteraciones pares 0,2,4 las variables
x,y,z
se establecen en 1 para comenzar un nuevo cálculo. En cada iteración, estas variables se multiplican por los componentes x, y y z de cada vector, utilizando los datos de longitud y latitud almacenados ent[0],t[1]
(que también se asignan por razones de golfu,v
). La suma de las variables se escribe en la matrizn
(los valores de basura en las iteraciones pares se sobrescriben con los valores correctos en las iteraciones impares) para que al finaln
contenga los 3 productos de puntos[a.b, c.a, b.c]
.Para la regla del coseno, necesitamos los cosenos de los tres ángulos incluidos entre vértices, pero también necesitamos los senos. Estos se obtienen como
sqrt(1-cosine**2)
. A medida que los senos se multiplican, la expresión se puede reorganizar para que solo una llamada asqrt
se requiera . El hecho de que no sepamos si el seno fue positivo o negativo no importa, ya que la fórmula de haversina siempre da el seno positivo de todos modos. La cantidad física importante es la distancia entre los puntos, que es absoluta y, por lo tanto, siempre positiva.Para cada iteración
i=0..2
, calculamos el valor para el elemento de matriz opuesto al ánguloi-1
usando los otros elementosi
yi-2
. Los subíndices de matriz negativos como este son legales en Ruby, simplemente se ajustan al comienzo de la matriz.Sin golf en el programa de prueba
Requiere tres conjuntos de coordenadas en la misma línea, con espacios entre ellas.
fuente