Хорошо, сначала, я думаю, это поможет понять, откуда взялась используемая формула.
И еще до этого обратите внимание, что я буду использовать стандартные математические координаты. Это отличается от географического long / lat, но должно быть легко преобразовано
Следовательно, точка на сфере равна (x,y,z)= r*(cos p sin t, sin p sin t, cos t)
. Таким образом, p
- это угол от x
до y
, а t
- это угол оси z
.
Если у вас есть две точки (p, t) и (q, u), мы можем повернуть первую точку до p = 0, то есть по оси x
. Тогда точки имеют координаты (0,t)
и (q-p,u)
. Теперь мы поворачиваем точки вокруг y
так, что первая точка становится северным полюсом.
[ cos t, 0, -sin t] [x] [ cos t, 0, -sin t] [ cos(q-p) sin(u)]
[ 0 1, 0 ] . [y] = [ 0 1, 0 ] . [ sin(q-p) sin(u)]
[ sin t, 0, cos t] [z] [ sin t, 0, cos t] [ cos(u) ]
новый z
чем
z_new = sin(t) cos(q-p) sin(u) + cos(t)cos(u)
Естественно, длина дуги отсюда до северного полюса составляет всего
alpha = arcsin( sin(t) cos(q-p) sin(u) + cos(t)cos(u) )
и для истинного расстояния мы должны умножиться на радиус r
сферы.
Теперь другой путь. у нас есть точка (p,t)
, и мы хотим получить (q,u)
, учитывая, что ее направление составляет угол beta
к северу и на расстоянии d
. На первом этапе мы установили точку (p,t)
как северный полюс. Это делает вторую точку (Pi + beta, d/r)
(углы примечания математически положительны, если ccw). Эту систему необходимо повернуть так, чтобы северный полюс перешел к заданному значению (p,t)
. Это сделано
[ cos t, sin t, 0] [ cos p, 0, sin p] [x]
[ -sin p, cos t, 0] . [ 0 1, 0 ] . [y]
[ 0 , 0 , 1] [ -sin p, 0, cos p] [z]
настройка (Pi + beta, d/r) = (gamma, theta)
получаем
z_new = -sin(p)cos(gamma)sin(theta)+cos(p)cos(theta)
следовательно:
u = arccos( z_new )
Наконец:
x_new = cos(t) ( cos(p)cos(gamma)sin(theta) + sin(p)cos(theta) ) + sin(theta)sin(gamma)sin(theta)
Как x_new = cos(q)sin(u)
и мы знаем u
q = arccos( xnew / sin(u) ) = arccos( xnew / sqrt( 1 - z_new ) )
Надеюсь, я все понял правильно, и помню, что это в типичных математических полярных координатах, и его нужно перевести на использование sin / cos и определение угла в географии .