Как проверить, пересекаются ли круг и вогнутый многоугольник?

19

У меня есть многоугольник (иногда выпуклый, но часто вогнутый) и несколько кругов с разными радиусами. Как я могу узнать, пересекается ли / пересекается ли круг с многоугольником?

Я мог бы разбить мой вогнутый многоугольник на выпуклые части. Это поможет?

Адам Харт
источник

Ответы:

26

Есть два случая этой проблемы. Первый - это пересечение, а второй - перекрывающий (содержащий).

Первый (пересечение / многоугольник внутри круга):

Найдите ближайшую точку на каждом краю многоугольника к центру круга. Если любое расстояние между ближайшей точкой к центру меньше радиуса, вы получили пересечение или перекрытие.

Второе (круг - многоугольник): снимите луч из центра круга вправо (или влево / вверх / вниз) и пересчитайте пересечения луча / сегмента (ребра многоугольника). Если количество пересечений четное, круг находится за пределами многоугольника. Если это странный круг внутри.

Я поделюсь картинкой из лекции для этого случая:

введите описание изображения здесь

И заботиться о единичных случаях.

Надеюсь, это поможет.


редактировать: я думаю, что это просто справедливо, чтобы добавить кредиты на картинку. Автор Петр Фелькель, доцент Чешского технического университета в Праге

NotaBene
источник
Я не думаю, что это сработает, если просто «выстрелить» лучу вправо. Возможно, я неправильно понял ваш подход, но из того, что я понял, он потерпит неудачу с настройкой, как показано здесь: imgur.com/Whg2u
bummzack
2
Да, но это описано в первом случае. Луч стрельбы будет решать только круг, содержащий многоугольник (второй случай в моем описании). Вы должны проверить оба случая. Это быстро, легко реализовать и не требует никакой памяти.
Notabene
1
Извините, я перепутал "край" с "вершиной" и поэтому неверно истолковал вашу первую проверку. При правильном чтении это работает :)
bummzack
7

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

SAT per se работает только на двух выпуклых многоугольниках. «Разделительная ось» в названии относится к осям, перпендикулярным краям многоугольника. Круги, к сожалению, имеют бесконечное их количество. Однако оказывается, что существует довольно простой способ выяснить, какие из этих осей актуальны, если посмотреть на то, какой проект направлен наружу, чтобы пересекать вершины многоугольника.

Вместо того, чтобы рассматривать весь алгоритм здесь, у Metanet Software (создателей N / N +) есть хорошее руководство по обнаружению столкновений с использованием SAT , третий раздел которого посвящен SAT, когда один из объектов представляет собой круг .


источник
У вас есть ссылка для разбиения вогнутого многоугольника на выпуклые многоугольники? Ссылка SAT, которую вы предоставили, не упоминает ничего подобного.
ехсанул
На самом деле это очень сложная проблема, зависящая от геометрии многоугольника, но все трехмерные движки делают это, так как аппаратные средства обычно могут воспроизводить только копланарные квадраты и треугольники, а не многоугольники.
SplinterReality
1
@ehsanul: en.wikipedia.org/wiki/Polygon_triangulation описывает пару популярных подходов.
0

Вот что я делаю.

  1. Используйте тест горизонтальной линии, чтобы определить, находится ли центр круга внутри многоугольника. Если это так, то они пересекаются.
  2. Если нет, проверьте следующий случай. Для каждой стороны многоугольника
    1. Найти наклон стороны многоугольника
    2. Рассчитать перпендикулярный уклон
    3. (ПРОЧИТАЙТЕ ЭТО ВНИМАТЕЛЬНО) Найдите пересечение между линией с наклоном стороны многоугольника, пересекающейся с любой вершиной, образующей сторону, и линией наклона, перпендикулярной той стороне, которая пересекает центр круга.
    4. Если установленная точка пересечения находится внутри круга, это означает, что круг в некоторой точке пересекает указанную сторону и, следовательно, пересекает многоугольник
  3. Наконец, если ничто иное не является окончательным, проверьте, лежат ли какие-либо вершины многоугольника внутри круга (из-за предыдущих тестов вам нужно проверить только один раз). Если это так, они пересекаются. Если нет, вы можете окончательно сказать, что они этого не делают.
Чирааг Чакраварти
источник