8

次のようなスプライト シートがあるとします。

スプライト シートの例

ピクセル データをループして各スプライトの境界四角形を決定できるアルゴリズムを書きたいと思います。

各ピクセル X、Y について true (ピクセルが完全に透明ではない) または false (ピクセルが完全に透明) のいずれかを取得できると仮定すると、各スプライトの境界矩形を自動的に生成するにはどうすればよいでしょうか?

結果のデータは、{x、y、幅、高さ} を持つ四角形オブジェクトの配列である必要があります。

これは同じ画像ですが、最初の 4 つのスプライトの境界が水色でマークされています。

境界のあるスプライト シート

上記のようにこれらの境界を検出する方法について、誰かが段階的に説明できますか?

4

3 に答える 3

2

これはどう?唯一の欠点は、訪問したピクセルをマークするために書き込み可能なバージョンの画像が必要になることです。そうしないと、フラッドフィルが終了しません。

Process each* scan line in turn
  For each scanline, walk from left to right, until you find a non-transparent pixel P.
    If the location of P is already inside a known bounded box
      Continue to the right of the bounded box
    Else
      BBox = ExploreBoundedBox(P)
      Add BBox to the collection of known bounded boxes

Function ExploreBoundedBox(pStart)
  Q = new Queue(pStart)
  B = new BoundingBox(pStart)

  While Q is not empty
    Dequeue the front element as P
    Expand B to include P

    For each of the four neighbouring pixels N
      If N is not transparent and N is not marked
        Mark N
        Enqueue N at the back of Q

  return B

すべてのスキャンラインを処理する必要はありません。10 番目ごと、または 30 番目のスキャンラインごとに行うことができます。スプライトの最小高さを超えない限り。

于 2012-11-27T13:13:49.473 に答える