Как определить, перекрываются ли два прямоугольника (под углом) - PullRequest
1 голос
/ 10 ноября 2019

Я хочу определить, перекрываются ли два прямоугольника (не пересекаются). Я знаю, как это сделать для выровненных по оси прямоугольников, но в этом случае у меня есть один прямоугольник, который не всегда выровнен по оси (он же повернут по центру). В этом посте показано, как вычислить два пересекающихся прямоугольника, но он не классифицирует один прямоугольник внутри другого, как показано на этом рисунке , поскольку они перекрываются, а не пересекаются.

В моем случае один из прямоугольников выровнен по оси (черный ящик), а другой вращается (красный прямоугольник), что может упростить эту задачу.

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

Дополнительные сведения: это для моего графического программного клипера (в этом случае не могу использовать аппаратное вырезание)где черный ящик - это мое окно / окно просмотра, красный - «спрайт», а все, что находится вне черного ящика, обрезается / не отображается. Я использую ортогональную / 2D проекцию. В конце у меня будет две функции, одна для обнаружения, если спрайт находится за пределами окна / области просмотра (о чем я спрашиваю в этом вопросе), а позже я сделаю функцию для обрезки спрайта внутри окна /окно просмотра с использованием алгоритма Сазерленда – Ходжмана.

1 Ответ

1 голос
/ 12 ноября 2019

Это обычно называется тестом пересечения AABB-OBB. (ограниченная осью ограничительная рамка и ориентированная ограничительная рамка). Если один ограничивающий прямоугольник полностью находится внутри другого, это все еще считается «пересечением».

Чтобы решить эту проблему, используйте теорему о разделительной оси. Если AABB и OBB не перекрываются, то они должны иметь хотя бы одну разделяющую ось, параллельную одной из их сторон.

Для теста пересечения OBB-OBB вы проецируете две фигуры на 8 разныхлиний (по одной для каждого края каждого прямоугольника) и выполните простой 1D-тест на перекрытие для каждой проекции.

Для AABB-OBB это в основном то же самое, но сокращается до 4 проекций, поскольку четыре пары ребер всегдапараллельно.

Взгляните на следующее объяснение OBB-OBB:

https://gamedev.stackexchange.com/questions/25397/obb-vs-obb-collision-detection

...