Эффективно группируйте перекрывающиеся прямоугольники - PullRequest
1 голос
/ 11 декабря 2011

Лучший способ сгруппировать перекрывающиеся прямоугольники? Я пытался использовать OpenCV, но метод grouprectangles не работает должным образом.

Я думал о том, чтобы сделать что-то вроде этого:

L = [every rectangle]
L_next = []
while not L.empty():
    for rectangle in L:
        L.remove(rectangle)
        for other_rectangle in L:
            if rectangle overlaps with other_rectangle:
                L_next += rectangle + other_rectangle
    L = L_next
    L_next = []

Поскольку каждый не слитый прямоугольник будет удален из следующего списка, в худшем случае у меня будет n/2 итераций внешнего цикла. Два внутренних цикла должны выполняться n и n - 1 раз, так что алгоритм должен быть примерно O(n^3) в худшем случае, предполагая, что я ничего не пропустил, и что каждый шаг занимает только O(1).

Проблемы:

1) Нужно использовать классы эквивалентности или что-то в этом роде для правильного объединения групп прямоугольников. У Boost есть что-нибудь подобное?

2) Это похоже на операцию, которая должна выполняться часто, поэтому я удивлен, что не нашел больше материала по ней. Что с этим?

3) Предполагая, что на самом деле что-то для этого не реализовано, есть ли у кого-нибудь совет улучшить мой метод?

4) Как лучше всего увидеть, если два прямоугольника перекрываются?

1 Ответ

0 голосов
/ 11 декабря 2011

Я бы посмотрел на pygame.Rect.collide методы для ответа на вашу проблему.Так как обнаружение перекрытия прямоугольников очень распространено в играх, я думаю, что их реализация довольно хороша с точки зрения вычислительной сложности.

...