フラッドフィルに似たアルゴリズムを実装しようとしています。問題は、それをどのように実装すべきかわからないことです。たとえば、再帰的-非再帰的です。
それぞれに欠陥があることは知っていますが、そのうちの1つは他の1つよりも高速である必要があります。非再帰が毎回4つの新しいポイントを割り当てると、再帰はスタック上で新しい関数を開きます。
非反復の例:
Stack<Point> stack = new Stack<Point>();
stack.Push(q);
while (stack.Count > 0)
{
Point p = stack.Pop();
int x = p.X;
int y = p.Y;
if (y < 0 || y > h - 1 || x < 0 || x > w - 1)
continue;
byte val = vals[y, x];
if (val == SEED_COLOR)
{
vals[y, x] = COLOR;
stack.Push(new Point(x + 1, y));
stack.Push(new Point(x - 1, y));
stack.Push(new Point(x, y + 1));
stack.Push(new Point(x, y - 1));
}
}
編集:600X600ピクセルのマップに次のアルゴリズムを適用します。塗りつぶしはマップ全体に適用されるわけではありませんが、反復ごとにマップの約30%〜80%をカバーする必要があります。私のポイントは、高さマップでエッジを検出し、さらに使用するためにそれらのエッジにマークを付けることです。