Проверка разделительной оси, обнаружение, если повернутый прямоугольник перекрывает другой плоский - PullRequest
2 голосов
/ 08 марта 2009

Я читал о пересечении прямоугольников на:

Алгоритм обнаружения пересечения двух прямоугольников?

Но у меня проблемы с его реализацией.

Если R1 (A, B, C, D) - мой повернутый прямоугольник, а R2 (A ', B', C ', D') - другой прямоугольник без вращения.

Формула, извлеченная из ссылки выше:

  edge = v(n) - v(n-1)

Вы можете получить перпендикуляр к этому, повернув его на 90 °. В 2D это просто как:

  rotated.x = -unrotated.y
  rotated.y =  unrotated.x

  // rotated: your rotated edge
  // v(n-1) any point from the edge.
  // testpoint: the point you want to find out which side it's on.

  side = sign (rotated.x * (testpoint.x - v(n-1).x) + 
               rotated.y * (testpoint.y - v(n-1).y);

Мои повернутые края будут из R1 с

AB (xB-xA, yB-yA), поэтому повернутый x является xB-xA? BC (xC-xB, yC-y1) CD ... AD ...

Контрольной точкой будет A ', B', C ', D' от R2 Поэтому я должен проверить знак результата со всех точек R2 на 4 ребра из R1. Это 16 сравнений, если они пересекаются. Как я узнаю, что нашел разделительный край?

Спасибо

1 Ответ

2 голосов
/ 11 марта 2009

Если для какого-либо заданного ребра признаки любого из точечных произведений, проверяющих это ребро, не совпадают, значит, у вас есть пересечение. Знак точечного произведения будет одинаковым для всех точек на одной стороне линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...