1

キャンバス上に指定されたサイズの多数の画像 (または簡単にするために長方形) をランダムに配置しようとしています。また、これらの画像/長方形をわずかに重ねることができるようにしたい (エッジ、側面など)。つまり、画像が別の画像を完全に覆ってしまうことは望ましくありません。これらの画像/長方形は、x 軸と y 軸に平行です。また、未使用の余白がないように、画像をキャンバス領域に完全に合わせたいと思っています。

Bin Packing や Quadtree などに出会いましたが、これらのどれも重複を許可していません。これがどのように実装されるか、誰にも分かりますか? それとも正しい方向に私を向けますか?

ありがとうございました :)

4

1 に答える 1

2

指定された条件を仮定します。

  • 未使用の空白がない
  • 軸合わせの向き
  • オーバーラップのマージンを許可する
  • イメージ全体を覆い隠すことはありません

ビン パッキングまたは四分木アルゴリズム (または何でも) を使用できますが、最初にデータ セットを操作する必要があります。

  1. 画像サイズのリストをループします
    • この画像をオーバーラップさせるかどうかを決定します (目的の出力を調整するため)。
    • 優先アルゴリズム (bin-pack/quadtree) で使用する次元データを (マージン内で) 増やします (元のデータも保持します)。
  2. 選択したアルゴリズムでデータを処理する
  3. z オーダー/レンダリング オーダーを並べ替えます (ランダムに並べ替える、領域で並べ替えるなど)。
  4. 元の寸法データを使用して画像をレンダリングします - コーナーではなく、領域の中心にある原点を必ず使用してください

基本的に、セットを配置する前に、特定の画像の重なりを決定します。

私は2つの制限を考えることができます:

  1. 最小画像サイズは、許可する最大オーバーラップに基づいています。
    • これは、レンダリング順序を最大から最小にソートすることで解決できます。
  2. 画像の並べ替え方法とキャンバスのサイズによっては、画像がキャンバスに収まらない場合があります。ビンのパッキングによって隙間が生じる場合があります。
    • これは、より複雑なアルゴリズムで解決できる可能性があります-私はそれらを十分に使用していません。
    • 画像を拡大縮小して領域を埋めることができるかもしれません - 繰り返しますが、私はこの領域について十分に知りません.
于 2013-05-09T02:11:22.983 に答える