Je voudrais écrire un programme simple qui accepte un ensemble de fenêtres (largeur + hauteur) et la résolution d'écran et affiche une disposition de ces fenêtres à l'écran de sorte que les fenêtres prennent le plus d'espace. Il est donc possible de redimensionner une fenêtre, tout en conservant output size >= initial size
et le rapport hauteur / largeur. Donc, pour la fenêtre , j'aimerais que l'algorithme retourne un tuple .
Je pense que c'est peut-être une variante du sac à dos 2D. J'ai essayé de passer en revue les résultats sur le Web, mais ils avaient pour la plupart beaucoup d'expérience (et aucune implémentation), ce qui m'a rendu difficile à suivre.
Je suis moins intéressé par l'algorithme le plus rapide possible, mais plus par quelque chose de pratique pour mes besoins spécifiques.
la source
Réponses:
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 iWi xi,yi,hi,wi
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,Wj i≠j Wj Wi (x,y)∈{(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+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
la source
J'ai commencé à écrire un prototype pour une solution de force brute, qui, espérons-le, peut être optimisée au point où elle sera pratique.
Tout d'abord, quelques définitions: Soit l'ensemble de toutes les fenêtres. Chaque fenêtre est composée de pour les coordonnées x, y et la largeur et la hauteur. Une fenêtre est initialisée avec une largeur et une hauteur minimales.W w xw,yw,ww,hw
L'entrée de l'algorithme est l'écran, , qui a une largeur et une hauteur et une liste de fenêtres.S
Cela fonctionne à peu près ainsi:
Il y a quelques choses qui devraient être améliorées:
S.coordinates()
est très lent en ce moment. Il itère tous les pointsS.width x S.height
et vérifie si chacun se trouve dans l'une des fenêtres de S.S.put()
vérifie si son paramètre chevauche le reste des fenêtres de S en effectuant le test mentionné dans la réponse de Dave. Peut-être que cela peut être amélioré en utilisant des arbres d'intervalle ?S.score()
renvoie actuellement qui est simplement l'aire de toutes les fenêtres. Il doit prendre en compte d'autres variables pour produire de meilleures dispositions.La fonction ci-dessus doit essayer toutes les permutations de pour obtenir le meilleur résultat possible.W
J'essaie actuellement de trouver une structure de données appropriée pour représenter l'écran et ses fenêtres, il doit prendre en charge ces requêtes:
la source