Я ищу алгоритм для компоновки прямоугольных окон, требования следующие:
- Все окна, подлежащие компоновке, можно увидеть в виде небольших прямоугольников.
- Все окна должны быть расположены в прямоугольном 2D-дисплее, ширина и высота которого заданы.
- Есть несколько десятков окон для макета. Каждое окно имеет начальную позицию (x,y) и размер (ширина, высота).
- Алгоритм компоновки попытается разделить окна, чтобы избежать перекрытия окон, чтобы пользователю было легче видеть все окна.
Глобальное ограничение (max_x_offset, max_y_offset) задается так, чтобы перемещенная новая позиция каждого окна (new_x, new_y) удовлетворяла ограничению:
abs(new_x - x) <= max_x_offset and abs(new_y - y) <= max_y_offset
Глобальное ограничение является жестким ограничением, что означает, что если такой макет не может удовлетворить как 4, так и 5, мы должны удовлетворить глобальное ограничение и позволить некоторым окнам перекрываться.
- Алгоритм может не дать наилучших возможных результатов, но он должен работать быстро. Мы собираемся использовать этот алгоритм в приложении для рендеринга в реальном времени.
Я поискал в гугле и википедии и в некоторых научных статьях, но так и не нашел подходящего алгоритма для этой задачи. Какие-либо предложения? Спасибо!
Обновление: Да, я понимаю, что это проблема с двумерным рюкзаком, и это NP-трудно. Мне нужен быстрый алгоритм для получения достаточно хорошего результата.