У вас серьезный случай магических чисел в коде. Выражение:
(60 * 1.1515 * 1.609344 * 1000)
появляется дважды, но этому нет особых объяснений. С некоторой помощью: 1.609344 - это количество километров в миле; 60 - количество минут в градусе; 1000 - это количество метров в километре; и 1.1515 - это количество уставных миль в морской миле (спасибо, DanM). Одна морская миля - это одна минута широты на экваторе.
Я полагаю, вы используете модель сферической земли, а не сфероидальную землю? Алгебра не достаточно сложна, чтобы быть сфероидальной.
Первая формула - преобразование между двумя парами широты и долготы - нечетна. Вам нужны и дельта-лат (Δλ), и дельта-лон (Δφ), чтобы разобраться в ответе. Далее расстояние между парами:
(60° N, 30° W), (60° N, 60° W)
(60° N, 60° W), (60° N, 90° W)
должно быть таким же, но я уверен, что ваш код дает разные ответы.
Итак, я думаю, вам нужно вернуться к справочным материалам по сферической тригонометрии и посмотреть, что вы делаете неправильно. (Мне понадобится некоторое время, чтобы найти книгу на эту тему - ее нужно будет распаковать из любой коробки, в которой она находится.)
[ ... проходит время ... распаковка завершена ... ]
Дан сферический треугольник с углами A , B , C в вершинах и сторонах a , b , c напротив этих вершин (то есть сторона a от B до C и т. Д.), Формула косинуса это:
cos a = cos b . cos c + sin b . sin c . cos A
Применяя это к задаче, мы можем назвать две заданные точки B и C , и мы создадим прямоугольный сферический треугольник с прямым углом в A .
Искусство ASCII в худшем виде:
+ C
/|
/ |
a / | b
/ |
/ |
/ |
B +------+ A
c
Сторона c равна разнице в долготе; сторона b равна разнице в широте; угол A равен 90 °, поэтому cos A = 0. Поэтому я считаю, что уравнение для a равно:
cos a = cos Δλ . cos Δφ + sin Δλ . sin Δφ . cos 90°
a = arccos (cos Δλ . cos Δφ)
Угол a в радианах затем преобразуется в расстояние путем умножения на радиус Земли. В качестве альтернативы, если дать a в градусах (и долях градуса), то есть 60 морских миль на один градус, следовательно, 60 * 1.1515 статутных миль и 60 * 1.1515 * 1.609344 километра на один градус. Если вам не нужно расстояние в метрах, я не вижу необходимости в коэффициенте 1000.
Пол Томблин указывает на Aviation Formulary v1.44 в качестве источника уравнения - и, действительно, он существует вместе с более численно устойчивой версией для случаев, когда разница в положении мала.
Переходя к базовой тригонометрии, мы также знаем, что:
cos (A - B) = cos A . cos B + sin A . sin B
Если применить это дважды в уравнении, которое я дал, вполне может оказаться в формуле в Авиационном формуляре.
(Моя ссылка: "Астрономия: принципы и практика, четвертое издание" А.Е. Роя и Д. Кларка (2003); моя копия - первое издание 1977 года, Адам Хилгер, ISBN 0-85274 346-7.)
NB Check (Google) 'define: "навигационная миля"'; Похоже, что морская миля в настоящее время составляет 1852 м (1,852 км) по определению. Множитель 1.1515 соответствует старому определению морской мили как приблизительно 6080 футов. Используя bc
со шкалой 10, я получаю:
(1852/(3*0.3048))/1760
1.1507794480
Какой фактор работает для вас, зависит от того, на чем вы основаны.
Если посмотреть на вторую проблему из первых принципов, у нас немного другая схема, и нам нужно «другое» сферическое тригонометрическое уравнение, формула синуса:
sin A sin B sin C
----- = ----- = -----
sin a sin b sin c
Адаптация предыдущей диаграммы:
+ C
/|
/ |
a / | b
| / |
|X/ |
|/ |
B +------+ A
c
Вам дана начальная точка B , угол X = 90º - B, длина (угол) a и угол A = 90 °. За вами следуют b (дельта по широте) и c (дельта по долготе).
Итак, имеем:
sin a sin b
----- = ----
sin A sin B
Или
sin a . sin B
sin b = -------------
sin A
Or, поскольку A = 90 °, sin A = 1 и sin B = sin (90 ° -X) = cos X:
sin b = sin a . cos X
Это означает, что вы преобразуете пройденное расстояние в угол a , берете синус этого, умножаете на косинус направления курса и берете арксинус результата.
Учитывая a , b (только что вычислено) и A и B , мы можем применить формулу косинуса, чтобы получить с . Обратите внимание, что мы не можем просто повторно применить формулу синуса, чтобы получить c , поскольку у нас нет значения C и, поскольку мы играем со сферической тригонометрией, нет удобное правило, что C = 90 ° - B (сумма углов в сферическом треугольнике может быть больше 180 °; рассмотрим равносторонний сферический треугольник со всеми углами, равными 90 °, что вполне выполнимо).