Embora sua pergunta não diga isso, estou assumindo que você não deseja que as janelas se sobreponham.
Uma abordagem para esse problema é usar um solucionador de restrições como o Choco . Basta escrever as restrições que codificam o seu problema, ajustar o solucionador para agir de maneira inteligente e depois deixá-lo funcionar. Isso significa que todo o pensamento que você precisa fazer será gasto em encontrar uma boa maneira de codificar o problema, não em criar um algoritmo e fazer a programação e o ajuste. Aqui está uma resposta parcial para você começar.
Suponha que o tamanho da tela seja .xm a x× ym a x
Para cada janela, , você terá um conjunto de variáveis e restriçõesx i , y i , h i , w iWEuxEu, yEu, hEu, wEu
- xEu, yEu, hEu, wEu≥ 0
- xEu+ wEu≤ xm a x
- yEu+ hEu≤ ym a x
- Talvez também algumas restrições quanto ao tamanho mínimo das janelas, por exemplo, e assim por diante.hEu≥ 100
- Restrições aspecto: Se proporção é de 3: 4, a restrição poderia ser algo como , onde ε é um pequeno termo de erro diferente de zero para permitir a janela não-perfeito tamanhos, caso contrário você restringiria demais o problema.4 hEu- ϵ ≤ 3 wEu≤ 4 hEu+ ϵϵ
Agora você precisa cuidar da sobreposição da janela. Para cada par de janelas, , onde i ≠ j , você vai gerar constrangimentos como o seguinte, que capturam que nenhum canto do W j aparece dentro W i . Para ( x , y ) ∈ { ( x j , y j ) , ( x j + w j , y j ) , ( x j , yWEu, Wji ≠ jWjWEu , gera restrição:( x , y) ∈ { ( xj, yj) , ( xj+ wj, yj) , ( xj, yj+ hj) , ( xj+ wj, yj+ hj) }
- .¬ ( xEu≤ x ≤ xEu+ wj∧ yEu≤y≤ yEu+ hj)
As restrições especificadas até agora descrevem apenas janelas não sobrepostas que não se espalham pelas laterais da tela, que atendem a algumas restrições de tamanho mínimo e que preservam sua proporção.
Para obter um bom ajuste, é necessário especificar uma métrica que capture o que significa ser um bom layout. Uma possibilidade é supor que você deseja manter as janelas aproximadamente iguais em tamanho e / ou que deseja minimizar o "espaço em branco". Eu não acho que isso possa ser especificado usando o Choco, mas pode ser possível com outra solução de restrição (alguém pode ajudar aqui).
Choco permite maximizar o wrt para uma função objetiva especificada como uma única variável. Com base nessa idéia, você pode maximizar o seguinte:
- ∑Eu( hEu+ wEu)
escrevendo uma restrição e dizendo ao Choco para maximizar c o s t .c o s t = ∑Eu( hEu+ wEu)c o s t