Je crée des éléments qui ressemblent à ceux de Mac OS X avec Windows dans Exposé. Il s'adapte au rapport d'aspect des articles et au rapport d'aspect de la zone disponible.Algorithme de présentation de l'exposition
Fondamentalement, la zone disponible est divisée en lignes et en colonnes. Un élément est placé dans chaque cellule (l'intersection d'une ligne et d'une colonne). Les éléments doivent conserver leur ratio d'aspect (ici width/height
) malgré le format de la cellule. Le nombre de cellules doit être supérieur ou égal au nombre d'éléments. Dans le cas où le nombre de cellules est supérieur au nombre d'éléments, la dernière rangée ne sera pas entièrement utilisée. Le but est d'avoir autant de surface disponible utilisée par les articles que possible. Je suis à peu près sûr que plus le ratio d'aspect de chaque cellule est proche du format de l'élément, mieux c'est.
Les ouvrages suivants et lorsque le ratio d'aspect de surface disponible est égal au rapport d'aspect des produits:
rows := round(sqrt(count));
columns := ceiling(sqrt(count));
Où: count
est le nombre d'éléments; round(x)
arrondit x
à la valeur intégrale la plus proche, en arrondissant à mi-chemin les cas éloignés de zéro; et ceiling(x)
renvoie la plus petite valeur intégrale non inférieure à x
.
Je sais que Compiz utilise l'algorithme similaire suivant, mais il ne prend pas en compte les rapports d'aspect des éléments et la surface disponible:
rows := floor(sqrt(count + 1));
columns := ceiling(count/rows);
Où: floor(x)
retourne la plus grande valeur intégrale non supérieure à x
.
Je ai mis en place l'algorithme O (n) suivant qui teste chaque combinaison de lignes et de colonnes et cherche le meilleur ajustement, mais il y a sûrement un algorithme O (1) car cela produit exactement les mêmes (1)) algorithme lorsque les rapports d'aspect des articles et de la zone disponible sont les mêmes:
fit (itemCount, itemRatio, availableRatio)
{
bestRows := infinity;
bestColumns := infinity;
bestDiff := infinity;
for (rows := 1; rows <= count; rows += 1)
{
columns := ceiling(count/rows);
cellWidth := availableRatio/columns;
cellHeight := 1.0/rows;
cellRatio := cellWidth/cellHeight;
diff := abs(cellRatio - itemRatio);
if (diff < bestDiff)
{
bestRows := rows;
bestColumns := columns;
bestDiff := diff;
if (diff = 0)
break;
}
}
return (bestRows, bestColumns);
}
Où: abs(x)
renvoie la valeur absolue de x
.
REMARQUE: Vous remarquerez peut-être ce n'est pas optimisé du tout
Alors, quelle est la meilleure façon d'avoir la zone la plus disponible utilisé par les éléments que possible? (En d'autres termes, comment puis-je trouver la meilleure solution?)
Toute information serait agréable .. Je ne peux pas savoir quoi rechercher, je n'arrive pas à trouver quelque chose. Juste un nom commun pour le problème fonctionnerait. – vedosity
sans connaissance préalable, vous auriez à regarder au moins les dimensions de tout le monde, de sorte que ce serait déjà O (n). Je ne vois pas de moyen raisonnable de le faire O (1) à moins d'avoir des informations supplémentaires. – lijie
Les éléments ont tous le même rapport d'aspect et peuvent être redimensionnés tant que leur format est le même. Vous pourriez le regarder comme leur largeur serait le rapport d'aspect et leur taille serait 1, ainsi les dimensions sont des valeurs connues. – vedosity