スキャンライン フラッド フィルの考え方は次のとおりです。
- 初期点(シード)(x、y)が与えられます
- ピクセル (x-1, y) が塗りつぶされなくなるか、x=0 になるまで、できるだけ左に移動します。
- 到達した x がスキャンラインの開始点になります。「上にある洞窟を探す」と「下にある洞窟を探す」という 2 つのフラグを保持し、どちらも true に初期化します
- これは走査線ループの始まりです。(x, y-1) の上のピクセルを塗りつぶすかどうかを確認し、ルックアバウト フラグとピクセルを考慮すると、次の 4 つのケースがあります。
- 「上を見る」が true でピクセルが塗りつぶされる場合、「新しい洞窟」が見つかり、(x, y-1) を「to-do リスト」に保存し、「上を見る」を false としてマークします。
- 「look above」が false で、ピクセルが塗りつぶされない場合、現在の洞窟は完成しており、別の洞窟を探す必要があるため、「look_above」を true としてマークするだけです
- それ以外の場合 (上を見て true でピクセルを塗りつぶさないか、上を見て false でピクセルを塗りつぶす必要がある場合)、何もしません。
- 「下を見る」フラグとピクセルの色 (x, y+1) を使用して、同じ推論を繰り返します。
- ピクセル (x, y) をペイントし、(x+1, y) に移動します。移動先のピクセルがペイントされない場合を除き、(5) から繰り返します。
- 「やることリスト」に何かある場合は、それを選んで、やることリストで見つけた座標を (x, y) として (1) に戻ります。
これは、4 つ接続されたフラッド フィルのバージョンです。8 連結の塗りつぶしの場合、スキャンラインを開始するときに (x-1, y-1) と (x-1, y+1) の洞窟もチェックする必要があり、洞窟 (x+1, y -1) および (x+1, y+1) (対応するフラグが true の場合)。
スキャンライン上を移動するときにやりたいことは、画像の緑色の点を To Do リストに追加することです。
シードの数は「最小」ではないことに注意してください (たとえば、例の最初の 2 つの「シードの上」は同じ洞窟になるため、実際に必要なのはそのうちの 1 つだけです)。それでも、それらを格納するために必要なスタックの量は、通常、ピクセルごとの再帰的アプローチに必要な量よりもはるかに少なくなります。
必要なメモリ量を制限する別の方法として、フロンティア ペインティング アルゴリズムを使用する方法があります。
- 初期シード (x, y) を
current_active
リストに入れてペイントします
next_active
リストを空に初期化する
- リスト内のすべてのピクセルについて、
current_active
ペイントする必要がある隣接ピクセルをチェックします。1 つ見つかったら、それをペイントしてnext_active
リストに追加します。
- 完了したら、
current_active
リストをnext_active
リストに設定し、リストが空でない限り2から繰り返します
このビデオで、2 つのアルゴリズムの動作例を確認できます。