Проверяем, находится ли точка внутри полигона или за его пределами

При проверке коллизий в 2D проекциях между точкой и полигоном необходимо выяснить, лежит ли точка внутри полигона, или же она расположена вне его площади.

Для примера создадим криволинейный полигон (n-gon) любой формы под именем “Plane” и отдельно меш под именем Point, состоящий всего из одной точки.

Указатели на полигон и точку, будут определяться следующим образом:

Для того чтобы определить, лежит ли точка point внутри полигона polygon, воспользуемся следующим алгоритмом:

  • Пройдем последовательно по всем ребрам полигона;
  • Для каждого ребра полигона проверим, лежит ли точка слева или справа от него;
  • Если в результате всех проверок точка лежит справа от ребра четное количество раз – точка находится внутри полигона;
  • Если точка лежит справа от ребер нечетное количество раз – точка находится вне полигона
  • Если точка лежит на одном из ребер – сразу считает что точка находится внутри полигона.

Напишем этот алгоритм для проекции на плоскость XY.

Для начала нам нужно получить координаты всех точек полигона в порядке из следования друг за другом. Используем для этого функцию points_sorted().

Координаты точки:

Если ориджины полигона и проверяемой точки не лежат в центре координат (0.0, 0.0, 0.0), нужно дополнительно привести все координаты к глобальной системе координат – умножить на матрицу мира matrix_world.

Определим функцию, которая в параметрах будет получить список координат полигона, отсортированный в нужном порядке и координаты точки, а на выходе возвращать 1, если точка находится внутри полигона, или 0 если она лежит вне полигона.

Теперь мы можем вызвать нашу функцию и предать в нее полученные ранее данные с координатами точек полигона и проверяемой точки:

В нашем примере точка лежит вне полигона. Можно передвинуть ее в любое другое место (в режиме редактирования, если координаты не пересчитываются в глобальную систему) и снова сделать проверку.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии