Я работаю над эффективным алгоритмом «скрытия» всех пар пересекающихся прямоугольников, расположенных в 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
, чтобы ни один видимый прямоугольник не пересекался с другим.