Это простая часть классической проблемы обнаружения столкновений .В основном AABB Trees (не уверен, что это ссылка best , но в любом случае это имя) используются для ее эффективного решения, но посмотрите все, что используют алгоритмы обнаружения столкновений для ограничивающего столкновенияобнаружение.Дерево AABB (Выравнивающая ось с выравниванием по оси) предназначено для «выровненных» прямоугольников, то есть прямоугольников, которые нельзя повернуть.
Для невыровненных прямоугольников просто возьмите наименьший выровненный по оси прямоугольник, содержащий ваш повернутый прямоугольник.Действительно, дерево AABB используется для ускорения обнаружения столкновений для произвольных многоугольников, взяв их ограничивающие рамки.В случае, когда выравнивающий ось ограничивающий прямоугольник равен всем вашим объектам, это даже лучше.
Однако, если вы не возражаете против производительности, используйте плоский список прямоугольников и выполните O (n). 2 ) поиск действительно был бы проще: в псевдокоде:
function intersection_free(rectangles)
for rect in rectangles
for rect2 in rectangles
if intersects(rect, rect2)
return false;
return true;
Простота - замечательная вещь, не правда ли?