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. P>
Je sais ce que sont les dimensions de l'écran. p>
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 à? p>
merci, p>
Jamie. P>
5 Réponses :
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) supposons maintenant qu'il y ait n objets, il y aura donc p> lignes d'objets (où le CEIL est le Fonction de plafond ), qui prendra P> N code> d'entre eux s'adapte à l'écran. Alors p>
n=ceil(sqrt(N*objectHeight*screenWidth/(screenHeight*objectWidth)))
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.
Une façon dont j'aime faire cela est d'utiliser la racine carrée de la zone: p>
laisser p>
alors, p>
et p>
S'ils ne sont pas carrés, alors il suffit de multiplier par conséquent pour garder le même rapport. P>
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): p>
et p>
Notez que l'un d'entre eux devra être CODE> plafond code> et l'autre r = nombre de rectangles code> p>
w = largeur de l'affichage code> p>
h = hauteur d'affichage code> p>
a = (w * h) / r code> est la zone par rectangle p>
l = sqrt (a) code> est la longueur de base de chaque rectangle. p>
c = sqrt (n) code> est le nombre de colonnes de votre grille p>
r = n / c code> est le nombre de lignes. p>
plancher code> sinon vous tronquerez des chiffres et une rangée peut manquer. P>
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)
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. p> exécuté ce code fournit la trace suivante: < / p> à 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. P> 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: p>
C'est presque exactement comme Question de Kenneth ici ALORS. Il a écrit sur son blog . p>
Si vous évomhez les proportions dans une dimension de sorte que vous emballez des carrés, cela devient le même problème. P>
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).
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]).