web-dev-qa-db-ja.com

2Dビンパッキングはプログラムでどのように達成されますか?

Stackoverflowについても同様の質問がいくつかありますが、NPハード問題とアルゴリズムをしっかり理解していない人が理解できる具体的な答えを提供するものはないようです。

長方形オブジェクトの2Dビンパッキングはどのように実行しますか?私の場合、最小限のスペースを使用して、スプライトシートとして使用するために、複数の画像を単一の画像にアセンブルしようとしています。各画像には、大きく異なる境界が含まれている可能性がありますが、コンテナに設定された境界はありません。

ビンパッキングアルゴリズムの一般的な概要を説明するのではなく、ビンパッキングアルゴリズムを理解している人が、これをプログラムで実現する方法を説明できることを望んでいました。

40
FrozenFire

「ビンパッキングコード」をGoogleで検索しました これが私の最初のヒットでした: http://codeincomplete.com/posts/2011/5/7/bin_packing/

概要は次のとおりです。バイナリツリーを構築します。ツリーの各ブランチにはスプライトが含まれています。各リーフノードは、使用可能なスペースを表します。最初は、ツリーにはルートノードのみがあり、使用可能なすべてのスペースを表します。スプライトをツリーに追加するには、スプライトを保持するのに十分な大きさの未使用(リーフ)ノードをツリーで検索します。スプライトをノードの占有者として設定し、ノードに2つの子を与えることにより、そのノードをリーフからブランチに変えます。 1つの子は、スプライトの右側の残りのスペースを表します。もう1つは、スプライトと最初の子の下の残りのスペースを表します。

上記でリンクした記事では、図とJavaScriptコードを使用して、これをより詳細に説明しています。また、固定サイズを事前に選択するのではなく、スプライトシートを動的に拡大する方法についても説明します。

24
rob mayoff