Кратчайший путь на сфере решения - PullRequest
6 голосов
/ 29 апреля 2011

Я пытаюсь написать алгоритм, который выполняет следующие действия:

Учитывая текущую позицию (в азимуте и наклоне) и целевую позицию (снова в A, I), в каком направлении мне нужно двигатьсяпутешествовать по кратчайшему пути.Возвращаемое значение может быть чем-то вроде вектора A = -1, I = +0,5, который я затем могу масштабировать для размера шага / времени.

Кратчайший путь можно найти, используя большой круг, это легко визуализировать, но трудно реализовать, как описано выше, потому что моя система координат не является непрерывной.

Моя система координат следующая (представьте, что вы стоите перед сферой)

Азимут 0 ~ пи при движении вдоль экватора вдоль передней стороны, 0 ~ пи при движении вдоль экватора вдоль задней стороны.

Наклон 0 ~ + pi при движении изот верха до низа сферы.

Итак, учитывая эту непостоянную систему координат, как мне создать решающую функцию, которая говорит «увеличить А», чтобы путешествовать по кратчайшему пути?

1 Ответ

3 голосов
/ 29 апреля 2011

У вас есть пара альтернатив.Первый - использовать формула Haversine .Здесь есть некоторый исходный код Javascript здесь .Это требует использования более традиционных широт / долгот, где экватор находится на широте 0, а полюса находятся на широте +/- π или +/- 90 ° (в зависимости от ваших единиц), а долгота находится в диапазоне [-180 °, 180 °) или [-π, π) снова в зависимости от ваших единиц.Вы можете многократно находить среднюю точку, пока не найдете приблизительный путь, соответствующий вашим потребностям.Вектор азимута / наклона будет просто разницей в широте / долготе между двумя соседними точками, хотя со временем это, скорее всего, вызовет ошибку, если вы неоднократно примените эти широты долготы / долготы к местоположению вашего агента.

Другой подход, который может вам пригодиться, - преобразовать ваши сферические координаты начального и конечного местоположения в декартовы координаты, назовите их точками u b и u e для начальной и конечной точек.Нормальный вектор v большого круга, соединяющего две точки, является перекрестным произведением двух (т. Е. v = u b x u e ), а угол θ равентолько арккозин нормализованного внутреннего произведения (т.е. θ = cos -1 (( u e u e ) / (| u b || u e )). Затем вы можете использовать кватернионное вращение и перебирать от 0 до θ относительно вектора v , чтобы фактическиперемещаться по пути. При таком подходе фактический мгновенный вектор в некоторой точке p вдоль пути - это всего лишь p x v , или вы можете просто аппроксимировать это, используя декартову разницу между двумя соседними точками вдоль пути.

...