Sebbene la tua domanda non lo dica, presumo che non desideri che le finestre si sovrappongano.
Un approccio a questo problema consiste nell'utilizzare un risolutore di vincoli come Choco . Uno semplicemente annota i vincoli che codificano il tuo problema, sintonizza il risolutore per agire in modo intelligente e quindi lascialo correre. Ciò significa che tutto il pensiero che devi fare sarà speso per trovare un buon modo per codificare il problema, non per escogitare un algoritmo e fare la programmazione e il tuning. Ecco una risposta parziale per iniziare.
Supponiamo che la dimensione dello schermo sia di .xmax×ymax
Per ogni finestra, , avrai una serie di variabili e vincolix i , y i , h i , w iWixi,yi,hi,wi
- xi,yi,hi,wi≥0
- xi+wi≤xmax
- yi+hi≤ymax
- Forse anche alcuni vincoli sulla dimensione minima di Windows, ad esempio, e così via.hi≥100
- Vincoli di aspetto: se le proporzioni sono 3: 4, il vincolo potrebbe essere simile a , dove è un piccolo termine di errore diverso da zero per consentire un non perfetto dimensioni della finestra, altrimenti si vincolerebbe eccessivamente il problema.ϵ4hi−ϵ≤3wi≤4hi+ϵϵ
Ora devi occuparti della sovrapposizione delle finestre. Per ogni coppia di finestre, , dove , genererai vincoli come i seguenti, che catturano che nessun angolo di appare all'interno di . Per , genera il vincolo: i ≠ j W 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) .
I vincoli specificati finora descrivono solo finestre non sovrapposte che non si estendono sui lati dello schermo, che soddisfano alcuni vincoli di dimensioni minime e ne preservano le proporzioni.
Per ottenere un buon adattamento, è necessario specificare una metrica che catturi il significato di un buon layout. Una possibilità è presumere che si desideri mantenere le finestre di dimensioni approssimativamente uguali e / o che si desideri ridurre al minimo lo "spazio bianco". Non penso che questo possa essere specificato usando Choco, ma potrebbe essere possibile risolvere un altro vincolo (qualcun altro potrebbe essere in grado di aiutare qui).
Choco consente di massimizzare wrt rispetto a una funzione obiettiva specificata come singola variabile. Sulla base di questa idea, è possibile massimizzare quanto segue:
scrivendo un vincolo e dicendo a Choco di massimizzare .c o s tcost=∑i(hi+wi)cost