Я решил до того, как проверять код на C#, сначала записать "своё видение".
Пусть даны точки
и
(здесь и далее указаны сферические координаты).
В новой метрике кратчайшим путем, соединяющим точки
и
, будет некоторая кривая, которая при
будет лежать на сфере.
Длину
этого пути можно найти так:
,
где
-- длина кратчайшей дуги на единичной сфере, соединяющей точки
и
. Эти точки -- "радиальные проекции" точек
и
на единичную сферу. Иначе -- пересечение луча, выходящего из центра сферы и проходящего соответственно через точку
или
, с единичной сферой.
Из описания понятно, что
-- это угол между лучами
и
(или, что то же самое, между
и
). Несложно найти явно:
Значит действительно с углами нельзя так просто, тогда
// сферические координаты первой точки
r_sf1 = Math.Sqrt(x1*x1 + y1*y1 + z1*z1); // расстояние до начала координат
theta1 = Math.Atan(Math.Sqrt(x1*x1 + y1*y1)/z1); // зенитный угол
varphi1 = Math.Atan(y1 / x1); // азимутальный угол
// сферические координаты второй точки
r_sf2 = Math.Sqrt(x2 * x2 + y2 * y2 + z2 * z2); // расстояние до начала координат
theta2 = Math.Atan(Math.Sqrt(x2 * x2 + y2 * y2) / z2); // зенитный угол
varphi2 = Math.Atan(y2 / x2); // азимутальный угол
// Искомое "расстояние"
r = Math.Sqrt((r_sf2 - r_sf1) * (r_sf2 - r_sf1) + Math.Acos( Math.Sin(theta1)*Math.Sin(theta2)*Math.Cos(varphi2-varphi1) + Math.Cos(theta1) * Math.Cos(theta2) ));
но соответствует ли это
? Или я чего то напутал ?
Т.е. правильно ли я понял, что
это тоже самое, что
?
Какие-то у меня сомнения
Цитата:
Если даны сферические координаты двух точек, то расстояние между ними можно найти так:
это по сути то, что вы выше пояснили, но тут же не учтено, то что мы "подкорректировали метрику" с
Цитата:
и слегка подправляем его:
-- Сб апр 28, 2012 19:46:46 --Здесь
-- характерное для Вашей задачи расстояние от центра сферы. Скажем, если Вы пишете что-то вроде имитатора полёта в Google Earth, то это средний радиус Земли. Однако
должно быть константой.
Вы действительно, хорошо поясняете :)
И это важное дополнение, это
получается коэффициент, который указывает по какому радиусу от центра должна огибаться траектория.