6
votes

Comment optimiser la mise en page des rectangles

J'ai un nombre dynamique d'objets rectangulaires également proportionnés et de taille que je souhaite afficher de manière optimale à l'écran. Je peux redimensionner les objets mais doit maintenir une proportion.

Je sais ce que sont les dimensions de l'écran.

Comment puis-je calculer le nombre optimal de lignes et de colonnes que je devrai diviser l'écran en et quelle taille je devrai augmenter les objets à?

merci,

Jamie.


3 commentaires

Ont-ils tous la même taille et l'orientation? Pouvez-vous les pivoter ou devriez-vous conserver à la fois la proportion et l'orientation?


Je suis à peu près sûr que c'est un problème complet de NP.


@John: Comment est ce NPC? Je pense que c'est au pire des cas linéaire (une itération sur le nombre possible de colonnes, qui est [1, N]).


5 Réponses :


0
votes

Votre mention des lignes et des colonnes suggère que vous envisagez d'organiser les rectangles dans une grille, éventuellement avec quelques espaces (par exemple une partie de la rangée inférieure) non remplie. En supposant que ce soit le cas:

Supposons que vous éliminiez les objets tels que (un numéro aussi inconnu) N code> d'entre eux s'adapte à l'écran. Alors p> xxx pré>

supposons maintenant qu'il y ait n objets, il y aura donc p> xxx pré>

lignes d'objets (où le CEIL est le Fonction de plafond ), qui prendra P>

n=ceil(sqrt(N*objectHeight*screenWidth/(screenHeight*objectWidth)))


2 commentaires

Le problème, c'est comment calculer de manière optimale 'n' aussi. Bien sûr, si je sais combien d'objets je vais vous adapter à l'écran, il est simple de travailler tout le reste - mais c'est un inconnu. Le problème est de savoir comment calculer l'optimal 'n' et donc aussi le nombre de lignes requises - puis la largeur et la hauteur de l'objet qui en résultent ... Bravo, Jamie.


Absolument - Voir la modification: Je ne pense pas qu'une expression analytique pour la n optimale est possible, mais on peut minimiser la recherche.



1
votes

Une façon dont j'aime faire cela est d'utiliser la racine carrée de la zone:

laisser

r = nombre de rectangles

w = largeur de l'affichage

h = hauteur d'affichage

alors,

a = (w * h) / r est la zone par rectangle

et

l = sqrt (a) est la longueur de base de chaque rectangle.

S'ils ne sont pas carrés, alors il suffit de multiplier par conséquent pour garder le même rapport.

Une autre façon de faire une chose similaire est de prendre la racine carrée du nombre de rectangles. Cela vous donnera une dimension de votre grille (c'est-à-dire le nombre de colonnes):

c = sqrt (n) est le nombre de colonnes de votre grille

et

r = n / c est le nombre de lignes.

Notez que l'un d'entre eux devra être plafond et l'autre plancher sinon vous tronquerez des chiffres et une rangée peut manquer.


0 commentaires

5
votes

En supposant que tous les rectangles ont les mêmes dimensions et orientations et que cela ne devrait pas être changé.

Jouons! P>

// If ratio = w/h
r = ratio * (H/W)

// If ratio = h/w
r = H / (W * ratio)


0 commentaires

2
votes

Jamie, j'ai interprété "Nombre optimal de lignes et de colonnes" pour signifier "Combien de lignes et de colonnes fournira les plus gros rectangles, cohérents avec les proportions et la taille de l'écran requises". Voici une approche simple pour cette interprétation.

Chaque choix possible (nombre de lignes et de colonnes de rectangles) entraîne une taille maximale possible du rectangle pour les proportions spécifiées. La boucle sur les choix possibles et le calcul de la taille résultante implémente une recherche linéaire simple sur l'espace des solutions possibles. Voici un peu de code qui le fait, à l'aide d'un exemple d'écran de 480 x 640 et de rectangles dans une proportion 3 x 5. xxx

exécuté ce code fournit la trace suivante: < / p> xxx

à partir de ceci, il est clair que la présentation de 4x4 ou 5x3 produira les plus gros rectangles. Il est également clair que la taille du rectangle (en fonction du nombre de lignes) est pire (la plus petite) aux extrêmes et les meilleurs (plus grands) à un point intermédiaire. En supposant que le nombre de rectangles soit modeste, vous pouvez simplement coder le calcul ci-dessus dans votre langue de choix, mais renflouer dès que la zone résultante commence à diminuer après avoir augmenté à un maximum.

C'est un rapide. et sale (mais, j'espère une solution assez évidente). Si le nombre de rectangles est devenu assez grand pour vous soucier, vous pouvez modifier la performance de différentes manières:

  • Utilisez un algorithme de recherche plus sophistiqué (partitionnez l'espace et recherchez de manière récursive le meilleur segment),
  • Si le nombre de rectangles augmente pendant le programme, conservez le résultat précédent et réservez uniquement des solutions proches,
  • Appliquez un peu de calcul pour obtenir une formule plus rapide, précise, mais moins évidente.

0 commentaires

2
votes

C'est presque exactement comme Question de Kenneth ici ALORS. Il a écrit sur son blog .

Si vous évomhez les proportions dans une dimension de sorte que vous emballez des carrés, cela devient le même problème.


1 commentaires

Cette entrée de blog est excellente et plus utile pour une disposition cohérente. Le lien <-a href="http://stackoverflow.com/a/869381/1149459"> Lien dans la question de Kenneth a une réponse plus utile pour la maximisation théorique (c'est-à-dire en rotation des carrés pour minimiser l'espace dans le rectangle).