回答:
その特定の問題のアルゴリズムはわかりませんが、これにどのように取り組むことができるかを以下に示します。
X
とY
なります0
(X, Y)
ビットマップを検索してインクリメントし、未訪問の前景ピクセルに到達するまで、各ピクセルを左から右、上から下に移動します。(X, Y)
背景ピクセルまたは既にアクセスしたピクセルに到達するまで、右側から検索します。検出されたピクセルの量をとして保持しWIDTH
ます。セットするHEIGHT
し1
ます。X, Y + HEIGHT)
およびWIDTH
ピクセルを検索します。これらのピクセルがすべて前景に属している場合はHEIGHT
、1
。X, Y
およびWIDTH
で形成され、HEIGHT
、検索された四角形のリストに)をそれを囲むすべてのピクセルを訪問済みとしてマークします。X
しWIDTH
て検索を続けます(ステップ2に進みます)。ビットマップの右下のピクセルに到達すると、検索が終了します。アルゴリズムは、特定の例の3つの長方形を生成します。長方形が2つしかない結果を得るには、ステップ3を変更して、背景ピクセルでのみ停止し、すでにアクセスしたピクセルを無視するようにする必要があります。ただし、これにより四角形が重複する可能性があります。したがって、ステップ3は、未訪問および訪問済みの前景ピクセルを追跡することでさらに最適化できます。最後のピクセル(背景ピクセルの前)がアクセスされたピクセルである場合、最後にアクセスされていない前景ピクセルを使用してを取得しWIDTH
ます。
更新:私は先に進み、提案したアルゴリズムを実装しました。自分で試すことができるインタラクティブなデモを次に示します(ディスプレイが小さすぎる場合は、[Flashフルスクリーンで再生]をクリックしてください)。
コントロール:黒い領域をクリックしてドラッグし、ピクセルを描画します。ホールドShiftたまま消して消去します。ダブルクリックしてキャンバスをクリアします。
この問題は十分に規定されていません。単純な例を1つ提供したので、ここでは重要な論理的可能性とコーナーケースの一部を逃しました(または、それらを明示的に除外していません)。たとえば、この提案されたアプリケーションについて言及していないので、何がより重要であるかを指定していません。マップ全体を、同じ面積の専用の長方形に分割しますを可能な限りします(任意のソリューションの数)、または単にxとyのそれぞれでエッジが一致する長方形を取得します。後者だと思います。
上で描画した「プラス記号」の形をしたビットマスクのコーナーにすぐに位置する4つのタイルのそれぞれを埋める場合を考えます([2、2]が一番上)。次に、最適な長方形は何ですか?列だけを考えると、横に細いものを備えた、幅が狭く長い長方形、または画像の中央にあり、上下にずんぐりとした正方形の大きくて広い正方形を好みますか?
とにかく、可能な限り最長のエッジマッチングrectsを想定して、これを最初の試みのソリューションとして使用します。
列についてと同じように、行に対して上記の両方の手順を繰り返します(もちろん、代わりにx0とx1を使用し、別のリストを使用します)。
これで、きれいに縁取られた長方形のリストがいくつかあるはずです。ただし、アプリケーションに最適ではない場合があります。この場合、より効率的なパッキングを可能にするヒューリスティックスのシステムが必要になります。詳細については、パッキング問題を参照してください。