Обнаружение столкновения для повернутых прямоугольников намного сложнее, чем для выровненных по оси прямоугольников, но это не очень сложно:
Основная идея состоит в том, что два прямоугольника пересекаются тогда и только тогда, когда вы не можете нарисовать прямуюлиния между ними.Это звучит довольно очевидно и действительно справедливо для любой выпуклой формы.
Однако мы можем немного упростить задачу, поскольку имеем дело с прямоугольниками: одна из этих потенциальных разделительных линий будет параллельна одной изстороны прямоугольника.Это оставляет 4 возможных оси (по два на каждый прямоугольник).Мы только знаем, что линия параллельна, не совсем там, где она есть, но есть хитрость:
Для каждого направления линии создадим еще одну линию, перпендикулярную этому.Затем мы проецируем оба прямоугольника на эту линию.Теперь мы можем проверить, перекрываются ли прямоугольники.
Если они это сделают, мы ничего не знаем, но если нет, мы знаем, что прямоугольники окончательно не пересекаются.
После того, как мы попробовали все четыре возможных направления и не нашли разделяющую ось, мы знаем, что прямоугольники пересекаются.
Единственная сложная часть - проецирование прямоугольников на линию.Это делается с помощью точечного продукта, но вы, вероятно, найдете лучшие объяснения в других местах.Основная идея состоит в том, чтобы превратить каждый угол прямоугольника в число, представляющее, как далеко он находится вверх по линии.Затем возьмите минимальное и максимальное число для каждого прямоугольника и проверьте, перекрываются ли эти области.
Извините, я не предоставил никакого кода, но должна быть возможность выполнить эти шаги, чтобы получить рабочие реализации.
Я основал свой ответ на этом (где вы также можете найти фотографии):
https://www.gamedev.net/articles/programming/general-and-gameplay-programming/2d-rotated-rectangle-collision-r2604