Хотя ваш вопрос не говорит об этом, я предполагаю, что вы не хотите, чтобы окна перекрывались.
Одним из подходов к этой проблеме является использование решателя ограничений, такого как Choco . Один просто записывает ограничения, кодирующие вашу проблему, настраивает решатель так, чтобы он действовал разумно, и затем запускает его. Это означает, что все ваши мысли будут потрачены на поиск хорошего способа кодирования проблемы, а не на разработку алгоритма, а также на программирование и настройку. Вот частичный ответ, чтобы вы начали.
Предположим, что размер экрана равен .xmax×ymax
Для каждого окна, , у вас будет набор переменных и ограниченийx i , y i , h i , w iWixi,yi,hi,wi
- xi,yi,hi,wi≥0
- xi+wi≤xmax
- yi+hi≤ymax
- Возможно также некоторые ограничения на минимальный размер окон, например, и так далее.hi≥100
- Аспектные ограничения: Если соотношение сторон 3: 4, ограничение может быть примерно таким: , где - это небольшой ненулевой термин ошибки, который допускает несовершенные размеры окна, так как в противном случае вы бы чрезмерно ограничить проблему.epsi ;4hi−ϵ≤3wi≤4hi+ϵϵ
Теперь вам нужно позаботиться о перекрытии окон. Для каждой пары окон, , где , вы будете генерировать ограничения, подобные следующим, которые фиксируют, что ни один угол появляется внутри . Для сгенерируйте ограничение: i ≠ j W j W i ( x , y ) ∈ { ( x j , y j ) , ( x jWi,Wji≠jWjWi(x,y)∈{(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}
- ¬(xi≤x≤xi+wj∧yi≤y≤yi+hj) .
Указанные выше ограничения описывают только неперекрывающиеся окна, которые не растекаются по сторонам экрана, удовлетворяют некоторым ограничениям минимального размера и сохраняют соотношение сторон.
Чтобы получить хорошее соответствие, вам нужно указать метрику, которая отражает, что значит быть хорошим макетом. Одна из возможностей - предположить, что вы хотите, чтобы окна были примерно одинаковыми по размеру и / или что вы хотите минимизировать «пустое пространство». Я не думаю, что это может быть указано с помощью Choco, но это может быть возможно с другим решением ограничений (кто-то еще может помочь здесь).
Choco позволяет максимально увеличить целевую функцию, указанную в качестве одной переменной. Основываясь на этой идее, вы можете максимизировать следующее:
написав ограничение и сказав Choco, чтобы максимизировать .c o s tcost=∑i(hi+wi)cost