Я работаю над эффективным алгоритмом, чтобы «спрятать» все пары пересекающихся прямоугольников, выложенных в 2D в наборе прямоугольников N
(выровненный по оси). Все прямоугольники имеют одинаковую ширину и высоту.Быстрое спрямление пересекающихся прямоугольников
Пусть мой исходный набор прямоугольников, изложенных в 2D является R={r_1,r_2,...,r_n}
где r_i
все прямоугольники, r_i
имеет логический атрибут visible
.
Я хочу найти подмножество S из R такое, что для каждого r_i
, r_j
, принадлежащих S r_i,_r_j
, не пересекаются.
Первым тривиальным решением является подход с грубой силой и максимальным независимым набором. Сначала я перебираю прямоугольники размером N(N-1)/2
(данный прямоугольник не пересекается с самим собой) и проверьте, пересекаются они или нет. Одновременно я также помещал все прямоугольники в набор R
в качестве узлов графика G=(V,E)
. Края в этих графах представлены парами пересекающихся треугольников.
Набор непересекающихся прямоугольников тогда один максимальный независимый набор графа.
Я думаю, что это не самый быстрый подход, хотя и правильный. Я прочитал в некоторых обсуждениях, например, как сортировка заранее списка прямоугольников по их координате x ускорит вычисление пересекающихся пар прямоугольников до O(nlog(n))
(а не перебор O(n^2)
.
Теперь я прошу, сделайте кто-то знает лучшие алгоритмы для такой задачи (как для вычисления пересекающихся пар в наборе прямоугольников, так и для фильтрации этих прямоугольников?)
Реформирование проблемы как проблемы SAT также может быть интересным, хотя эта идея только что появилась на мой взгляд. Проблема заключалась бы в том, чтобы найти перестановку атрибутов visible
, чтобы ни один видимый прямоугольник не пересекал другой.
Ну, я попробую. Реальная проблема заключается в том, как найти перестановку прямоугольников таким образом, что при их попарном пересечении в исходном множестве нет пересекающихся прямоугольников. Существуют ли более быстрые подходы, чем мой, с максимальным независимым множеством? – linello
Я не уверен, что вы подразумеваете под перестановками прямоугольников. Вы создаете прямоугольники, выполняя перестановки на некоторые начальные значения? Я не верю, что есть другие способы сделать прямое пересечение, отличное от попарного. Возможно, вы можете использовать область прямоугольника/область пространства, в которой она занимает (если вы знаете, как ее пометить) и добавить это к карте. Затем снова проведите все прямоугольники и посмотрите, соответствуют ли они любой области на этой карте (кроме их собственной области). – Adrian
Параметр не нужен после сортировки списка. Вы можете использовать это свойство для записи проверки коллизий O (N log (N))! Он работает хорошо, я реализовал его в духе алгоритма линии сканирования. Это логика: i = 0, S = {}, N = | R | while (i
linello