Точка пересечения Луча-Полигона на поверхности сферы
-
06-07-2019 - |
Вопрос
У меня есть точка (широта / долгота) и курс в градусах (истинный север), по которому эта точка движется. У меня есть многочисленные стационарные многоугольники (точки, определенные в широте / долготе), которые могут быть или не быть выпуклыми.
Мой вопрос: как рассчитать ближайшую точку пересечения, если она есть, с многоугольником? Я видел несколько запутанных сообщений о трассировке лучей, но, похоже, все они относятся к 3D, когда луч и полигон не находятся на одной плоскости, а полигоны должны быть выпуклыми.
Решение 4
Ответ на этой странице кажется наиболее точным. Р>
Другие советы
звучит так, как будто вы должны быть в состоянии сделать простое пересечение двухмерной линии ...
Однако я уже работал с Lat / Long и знаю, что они не совсем верны ни для какой 2-й системы координат.
Я бы начал с общего "IsPointInPolygon" Функция, вы можете найти миллион из них путем поиска в Google, а затем проверить его на ваших поли, чтобы увидеть, насколько хорошо он работает. Если они достаточно точны, просто используйте это. Но возможно, что из-за не квадратной природы координат широта / долгота вам, возможно, придется внести некоторые изменения, используя сферическую геометрию.
В 2D вычисления довольно просты ...
Вы всегда можете начать с проверки, чтобы убедиться, что конечная точка луча не находится внутри многоугольника (поскольку в этом случае это точка пересечения).
Если конечная точка находится вне линии, вы можете выполнить пересечение отрезка луча / линии с каждым из граничных объектов многоугольника и использовать ближайший найденный участок. Это обрабатывает выпуклые / вогнутые элементы и т. Д.
Вычислите, пересекает ли луч каждый сегмент линии в многоугольнике используя эту технику .
Результирующий масштабный коэффициент в (моем принятом) ответе (который я назвал h
) равен "Как далеко вдоль луча находится пересечение". Вы ищете значение между 0
и 1
.
Если есть несколько точек пересечения, это нормально! Если вы хотите " во-первых, " используйте значение с наименьшим значением h
.