2012-01-06 13 views
37

stackoverflowに関するいくつかの同様の質問がありますが、それらのどれもNP困難な問題とアルゴリズムをしっかりと理解していない人が理解できるという明確な答えを提供しているようには見えません。2Dビンパッキングはプログラムによってどのように達成されますか?

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

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

+1

http://www.codeproject.com/KB/web-image/rectanglepacker.aspx –

+1

私は実際にその記事をかなり徹底的に読んでいましたが、ビンパッキングについての私の理解を向上させましたが、その実装例は構造だけに大きく依存していますC#で利用可能です。提供されたソースコードを読んだ後でも、彼が必要なステップのいくつかをどのように達成したかはわかりません。 – FrozenFire

答えて

20

I Googled "bin packing code"、これが私の最初のヒットだった:http://codeincomplete.com/posts/2011/5/7/bin_packing/

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

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

関連する問題