43

スタックオーバーフローについても同様の質問がいくつかありますが、NP困難な問題やアルゴリズムをしっかりと理解していない人が理解できる具体的な答えはありません。

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

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

4

1 に答える 1

31

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

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

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

于 2012-01-06T21:53:19.647 に答える