Aunque su pregunta no lo dice, supongo que no desea que las ventanas se superpongan.
Un enfoque para este problema es utilizar un solucionador de restricciones como Choco . Uno simplemente escribe las restricciones que codifican su problema, ajusta el solucionador para que actúe de manera inteligente y luego lo deja correr. Esto significa que todo el pensamiento que necesita hacer se gastará en encontrar una buena manera de codificar el problema, no en idear un algoritmo y hacer la programación y el ajuste. Aquí hay una respuesta parcial para comenzar.
Suponga que el tamaño de la pantalla es .xmax×ymax
Para cada ventana, , tendrá un conjunto de variables x i , y i , h i , w i y restriccionesWixi,yi,hi,wi
- xi,yi,hi,wi≥0
- xi+wi≤xmax
- yi+hi≤ymax
- Quizás también algunas restricciones sobre el tamaño mínimo de las ventanas, por ejemplo, y así sucesivamente.hi≥100
- Restricciones de aspecto: si la relación de aspecto es 3: 4, la restricción podría ser algo así como , donde ϵ es un pequeño término de error distinto de cero para permitir una ventana no perfecta tamaños, ya que de lo contrario restringiría el problema.4hi−ϵ≤3wi≤4hi+ϵϵ
Ahora debe ocuparse de la superposición de ventanas. Para cada par de ventanas, , donde i ≠ j , generará restricciones como las siguientes, que capturan que no aparece ninguna esquina de W j dentro de W i . Para ( x , y ) ∈ { ( x j , y j ) , ( x j + w j , y j ) , ( x j , yWi,Wji≠jWjWi , generar restricción:(x,y)∈{(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}
- .¬(xi≤x≤xi+wj∧yi≤y≤yi+hj)
Las restricciones especificadas hasta ahora solo describen ventanas no superpuestas que no se derraman a los lados de la pantalla, que satisfacen algunas restricciones de tamaño mínimo y que conservan su relación de aspecto.
Para obtener un buen ajuste, debe especificar una métrica que capture lo que significa ser un buen diseño. Una posibilidad es suponer que desea mantener las ventanas aproximadamente del mismo tamaño y / o que desea minimizar el "espacio en blanco". No creo que esto se pueda especificar usando Choco, pero puede ser posible con otra solución de restricción (alguien más podría ayudar aquí).
Choco permite maximizar el wrt a una función objetivo especificada como una sola variable. En base a esta idea, podría maximizar lo siguiente:
escribiendo una restricción y diciéndole a Choco que maximice c o s t .cost=∑i(hi+wi)cost