Excesso esférico de um triângulo
Como todos sabemos, a soma dos ângulos de qualquer triângulo plano é igual a 180 graus.
No entanto, para um triângulo esférico, a soma dos ângulos é sempre maior que 180 graus. A diferença entre a soma dos ângulos do triângulo esférico e 180 graus é denominada excesso esférico . A tarefa é calcular o excesso esférico de um triângulo com determinadas coordenadas de vértice.
Alguma experiência
Um triângulo esférico é uma parte da esfera definida por três grandes círculos da esfera.
Ambos os lados e ângulos do triângulo esférico são medidos no termo medida de ângulo, porque cada lado pode ser considerado como uma interseção da esfera e algum ângulo plano com vértice no centro da esfera:
Cada três grandes círculos distintos definem 8 triângulos, mas apenas levamos em consideração os triângulos apropriados . triângulos cujas medidas angulares e laterais satisfazem
É conveniente definir vértices de um triângulo em termos de sistema de coordenadas geográficas. Para calcular o comprimento de um arco de esfera, dada a longitude λ e latitude Φ de suas extremidades, podemos usar a fórmula:
, Onde
ou mais explicitamente:
(fonte: https://en.wikipedia.org/wiki/Haversine_formula )
As duas fórmulas básicas que podem ser usadas para resolver um triângulo esférico são:
- a lei dos cossenos:
- a lei dos senos:
(fonte: https://en.wikipedia.org/wiki/Spherical_trigonometry#Cosine_rules_and_sine_rules )
Dado três lados, é fácil calcular os ângulos usando a regra do cosseno:
Finalmente, o excesso esférico de um triângulo é definido:
O que é interessante sobre a relação entre o excesso esférico de um triângulo e sua área:
Assim, em uma esfera unitária, o excesso de um triângulo é igual à área desse triângulo!
A tarefa
Escreva uma função ou um programa que calcule o excesso esférico de um triângulo em graus, dadas as coordenadas dos vértices do triângulo. As coordenadas do vértice são fornecidas em termos de sistema de coordenadas geográficas.
Cada vértice deve ser passado em forma [latitude in degrees][N|S][longitude in degrees][E|W]
. A longitude e E
ou W
pode ser ignorada quando a latitude é 90, ou seja. 90N
, 90S
, 10N100E
, 30S20W
São descrições de vértice adequadas, enquanto 80N
ou 55S
não são.
As latitudes e longitudes são sempre inteiras nos casos de teste.
As respostas com erro menor que um grau serão aceitas (como nos exemplos abaixo). O resultado pode ser renderizado como real ou inteiro, portanto, conforme sua conveniência.
Exemplos
Entrada
90N0E
0N0E
0N90E
Resultado
89.999989
Entrada
90N
0N0E
0N90E
Resultado
89.999989
Entrada
0N0E
0N179E
90N0E
Resultado
178.998863
Entrada
10N10E
70N20W
70N40E
Resultado
11.969793
Em todos os casos de teste, longitude e latitude são números inteiros. Analisando as coordenadas dos vértices é a parte da tarefa, para um vértice deve ser passado como uma string única / literal, não é permitida a passagem 80N20E
de quatro parâmetros / strings: 80
, N
,20
, E
.
Isso garante que os vértices sejam todos distintos e nenhum dos três vértices forma um par de pontos antipodais.
Pontuação
Isso é código-golfe , então o código mais curto vence.
fonte
Respostas:
Matlab,
288266 bytesAqui a versão comentada que deve explicar o que está acontecendo:
Totalmente jogado (quebras de linha podem ser removidas):
fonte
Ruby, Rev 3
264255 bytesPrincipais mudanças:
Nova constante
r
= 180 / PI definida e usada em toda a função.e
teve que ser inicializado para + PI, então o excesso agora conta para baixo e é negado antes de retornar.t[]
eliminado: Ruby permite que os dados atribuídost[]
sejam diretamente atribuídos au,v,w.
i
Loop único para fazer o trabalho de dois?:
operadores ternários alterna entre tarefas.Muitas outras pequenas mudanças.
Ruby, Rev
1.283277 bytesRequer uma matriz de 3 strings.
Visão geral
Os comprimentos dos lados do triângulo na esfera unitária são iguais aos ângulos entre os vetores que descrevem os dois pontos. Mas não precisamos conhecer esse ângulo. Basta conhecer o cosseno do ângulo, que é facilmente obtido a partir de coordenadas cartesianas usando o Produto Dot.
Explicação
As cadeias de entrada são convertidas em uma representação de cadeia de uma matriz, que é então avaliada e armazenada
t
, como abaixo. O zero final não é necessário se duas coordenadas forem fornecidas. Se apenas a latitude 90 for fornecida, o zero será interpretado como a longitude.Os produtos Dot são da forma
a.b=ax*bx+ay*by+az*bz
. Como os vetores têm comprimento unitário, o produto escalar é igual ao cosseno do ângulo entre os vetores.Para calculá-los, um loop é repetido 6 vezes, passando duas vezes pelos dados de entrada. Mesmo nas iterações 0,2,4, as variáveis
x,y,z
são definidas como 1 para iniciar um novo cálculo. Em cada iteração, essas variáveis são multiplicadas pelos componentes x, ye z de cada vetor, usando os dados de longitude e latitude armazenados emt[0],t[1]
(aos quais também é atribuído por razões de golfeu,v
). A soma das variáveis é gravada na matrizn
(os valores de lixo nas iterações pares são substituídos pelos valores corretos nas iterações ímpares) para que no finaln
contenha os produtos de 3 pontos[a.b, c.a, b.c]
.Para a regra do cosseno, precisamos dos cossenos dos três ângulos incluídos entre os vértices, mas também precisamos dos senos. Estes são obtidos como
sqrt(1-cosine**2)
. À medida que os senos são multiplicados, a expressão pode ser reorganizada, de modo que apenas uma chamada parasqrt
seja necessária. O fato de não sabermos se o seno foi positivo ou negativo não importa, pois a fórmula do haversine sempre fornece o seno positivo de qualquer maneira. A quantidade física importante é a distância entre os pontos, que é absoluta e, portanto, sempre positiva.Para cada iteração
i=0..2
, calculamos o valor do ângulo oposto ao elemento da matrizi-1
usando os outros elementosi
ei-2
. Subscritos de matriz negativa como este são legais em Ruby, eles apenas envolvem o início da matriz.Ungolfed in program program
Requer três conjuntos de coordenadas na mesma linha, com espaços entre eles.
fonte