web-dev-qa-db-fra.com

Comment le remplissage de bacs 2D est-il réalisé par programme?

Il y a quelques questions similaires sur stackoverflow, mais aucune d'entre elles ne semble fournir une réponse tangible qu'une personne sans une solide compréhension des problèmes et des algorithmes NP-difficiles peut comprendre.

Comment effectuer un bin bin 2D d'objets rectangulaires? Dans mon cas, j'essaie d'assembler plusieurs images en une seule image, pour l'utiliser comme feuille de calcul, en utilisant le plus petit espace. Chaque image a peut-être des limites très différentes, mais il n'y a pas de limites définies pour le conteneur.

J'espérais que quelqu'un ayant une compréhension des algorithmes d'emballage de bac pourrait expliquer comment cela peut être réalisé par programme, plutôt que de fournir un aperçu général de la méthode d'emballage de bac.

40
FrozenFire

J'ai googlé "bin packing code" et ce fut mon premier succès: http://codeincomplete.com/posts/2011/5/7/bin_packing/

Voici un résumé: construisez un arbre binaire. Chaque branche de l'arbre contient un Sprite. Chaque nœud feuille représente l'espace disponible. Initialement, l'arborescence n'a que le nœud racine, qui représente tout l'espace disponible. Pour ajouter un Sprite à l'arbre, recherchez dans l'arbre un nœud inoccupé (feuille) assez grand pour contenir le Sprite. Transformez ce nœud d'une feuille en branche en définissant le Sprite comme occupant du nœud et en donnant au nœud deux enfants. Un enfant représente l'espace restant à droite du Sprite; l'autre représente l'espace restant sous le Sprite et le premier enfant.

L'article que j'ai lié ci-dessus explique cela beaucoup plus complètement, avec des diagrammes et du code JavaScript. Il explique également comment développer dynamiquement la feuille Sprite plutôt que de choisir une taille fixe à l'avance.

24
rob mayoff