Bien que votre question ne le dise pas, je suppose que vous ne voulez pas que les fenêtres se chevauchent.
Une approche de ce problème consiste à utiliser un solveur de contraintes tel que Choco . On écrit simplement les contraintes codant votre problème, ajuste le solveur pour qu'il agisse de manière intelligente, puis laissez-le s'exécuter. Cela signifie que toute la réflexion que vous devrez faire sera consacrée à trouver un bon moyen de coder le problème, pas à concevoir un algorithme et à faire la programmation et le réglage. Voici une réponse partielle pour vous aider à démarrer.
Supposons que la taille de l'écran soit .xmax×ymax
Pour chaque fenêtre, , vous aurez un ensemble de variables et des contraintesx i , y i , h i , w iWixi,yi,hi,wi
- xi,yi,hi,wi≥0
- xi+wi≤xmax
- yi+hi≤ymax
- Peut-être aussi quelques contraintes sur la taille minimale des fenêtres, par exemple et ainsi de suite.hi≥100
- Contraintes d'aspect: si le rapport d'aspect est de 3: 4, la contrainte pourrait être quelque chose comme , où est un petit terme d'erreur non nul pour permettre une non-perfection la taille des fenêtres, sinon vous imposeriez une contrainte excessive au problème.4hi−ϵ≤3wi≤4hi+ϵϵ
Vous devez maintenant prendre soin du chevauchement des fenêtres. Pour chaque paire de fenêtres, , où , vous générerez des contraintes comme les suivantes, qui capturent qu'aucun coin de n'apparaît dans . Pour , générer une contrainte:Wi,Wji≠jWjWi(x,y)∈{(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}
- ¬(xi≤x≤xi+wj∧yi≤y≤yi+hj) .
Les contraintes spécifiées jusqu'à présent ne décrivent que des fenêtres qui ne se chevauchent pas, qui ne débordent pas sur les côtés de l'écran, qui satisfont à certaines contraintes de taille minimales et qui préservent leur rapport hauteur / largeur.
Pour obtenir un bon ajustement, vous devez spécifier une métrique qui capture ce que signifie être une bonne mise en page. Une possibilité consiste à supposer que vous souhaitez conserver des fenêtres de taille à peu près égale et / ou que vous souhaitez minimiser les "espaces blancs". Je ne pense pas que cela puisse être spécifié en utilisant Choco, mais cela peut être possible avec une autre résolution de contrainte (quelqu'un d'autre pourrait être en mesure d'aider ici).
Choco permet de maximiser wrt à une fonction objective spécifiée comme une seule variable. Sur la base de cette idée, vous pouvez maximiser les éléments suivants:
en écrivant une contrainte et en disant à Choco de maximiser .c o s tcost=∑i(hi+wi)cost