Сферический избыток треугольника
Как мы все знаем, сумма углов любого плоского треугольника равна 180 градусам.
Однако для сферического треугольника сумма углов всегда больше 180 градусов. Разница между суммой углов сферического треугольника и 180 градусов называется сферическим избытком . Задача состоит в том, чтобы вычислить сферический избыток треугольника с заданными координатами вершины.
Некоторый фон
Сферический треугольник - это часть сферы, определяемая тремя большими кругами сферы.
Обе стороны и углы сферического треугольника измеряются в терминах угловой меры, потому что каждую сторону можно рассматривать как пересечение сферы и некоторый плоский угол с вершиной в центре сферы:
Каждые три отличных больших круга определяют 8 треугольников, но мы принимаем во внимание только правильные треугольники , т.е. треугольники, чьи углы и боковые меры удовлетворяют
Вершины треугольника удобно определять в терминах географической системы координат. Чтобы вычислить длину дуги сферы с учетом долготы λ и широты Φ ее концов, мы можем использовать формулу:
, где
или более точно:
(источник: https://en.wikipedia.org/wiki/Haversine_formula )
Две основные формулы, которые можно использовать для решения сферического треугольника:
- закон косинусов:
- закон синусов:
(источник: https://en.wikipedia.org/wiki/Spherical_trigonometry#Cosine_rules_and_sine_rules )
Учитывая три стороны, легко вычислить углы, используя правило косинуса:
Наконец, сферический избыток треугольника определяется:
Что интересно о связи между сферическим избытком треугольника и его площадью:
Таким образом, на единичной сфере избыток треугольника равен площади этого треугольника!
Задание
Напишите функцию или программу, которая будет вычислять сферический избыток треугольника в градусах с учетом координат вершин треугольника. Координаты вершин приведены в терминах географической системы координат.
Каждая вершина должна быть передана в форме [latitude in degrees][N|S][longitude in degrees][E|W]
. Долгота и E
или W
могут быть пропущены, когда широта 90, т.е. 90N
, 90S
, 10N100E
, 30S20W
Являются соответствующими описаниями вершин, в то время 80N
или 55S
нет.
Широты и долготы всегда целые в тестовых случаях.
Ответы с ошибкой менее одного градуса будут приняты (как в примерах ниже). Таким образом, результат может быть представлен как действительный или как целое число, по вашему усмотрению.
Примеры
вход
90N0E
0N0E
0N90E
Выход
89.999989
вход
90N
0N0E
0N90E
Выход
89.999989
вход
0N0E
0N179E
90N0E
Выход
178.998863
вход
10N10E
70N20W
70N40E
Выход
11.969793
Во всех тестовых случаях долгота и широта являются целыми числами. Синтаксические координаты вершин является частью задачи, поэтому вершина должна быть передана в одну строке / буквальной, он не может проходить в 80N20E
виде четырех параметров / строк: 80
, N
, 20
, E
.
Это гарантирует, что все вершины различны, и ни одна из трех вершин не образует пару антиподальных точек.
счет
Это код-гольф , поэтому выигрывает самый короткий код.
источник
Ответы:
Matlab,
288266 байтЗдесь комментируемого версия, которая должна объяснить, что происходит:
Полностью гольф (разрывы строк могут быть удалены):
источник
Ruby, Rev 3
264255 байтБольшие перемены:
Новая константа
r
= 180 / PI определена и используется во всей функции.e
должен был быть инициализирован в + PI, поэтому избыток теперь считается вниз и отменяется перед возвратом.t[]
исключено: Ruby позволяетt[]
напрямую назначать данные, которые были назначеныu,v,w.
Один
i
цикл, чтобы выполнить работу двух,?:
троичный оператор переключается между задачами.Много других мелких изменений.
Ruby, Rev 1
283277 байтТребуется массив из 3 строк.
обзор
Длины сторон треугольника на единичной сфере равны углам между векторами, описывающими две точки. Но нам не нужно знать этот угол. Достаточно знать косинус угла, который легко получить из декартовых координат с помощью произведения точек.
объяснение
Входные строки преобразуются в строковое представление массива, который затем оценивается и сохраняется
t
, как показано ниже. Конечный ноль не нужен, если заданы две координаты. Если задана только широта 90, ноль интерпретируется как долгота.Точечные продукты имеют форму
a.b=ax*bx+ay*by+az*bz
. Поскольку все векторы имеют единичную длину, произведение точек равно косинусу угла между векторами.Для их вычисления цикл повторяется 6 раз, дважды проходя через входные данные. На четных итерациях 0,2,4 переменные
x,y,z
устанавливаются в 1 , чтобы начать новый расчет. На каждой итерации эти переменные умножаются на компоненты x, y и z каждого вектора, используя данные о долготе и широте, которые хранятся в немt[0],t[1]
(который также назначен для целей игры в гольфu,v
). Сумма переменных записывается в массивn
(значения мусора на четных итерациях перезаписываются правильными значениями на нечетных итерациях), чтобы в концеn
содержалось произведение с 3 точками[a.b, c.a, b.c]
.Для правила косинуса нам нужны косинусы трех включенных углов между вершинами, но нам также нужны синусы. Эти получены как
sqrt(1-cosine**2)
. Поскольку синусы умножаются вместе, выражение можно переставить так, чтобыsqrt
требовался только один вызов . Тот факт, что мы не знаем, был ли синус положительным или отрицательным, не имеет значения, так как формула haversine всегда дает положительный синус в любом случае. Важной физической величиной является расстояние между точками, которое является абсолютным и поэтому всегда положительным.Для каждой итерации
i=0..2
мы вычисляем значение для угла, противоположного элементу массива,i-1
используя другие элементыi
иi-2
. Отрицательные подписки на массивы, подобные этому, допустимы в Ruby, они просто переходят к началу массива.Неуправляемый в тестовой программе
Требуются три набора координат на одной линии с пробелами между ними.
источник