6

これは、スタックベースのフラッドフィルアルゴリズム(ウィキペディアの定義に基づいています)のC#実装です。以前はコーディング中に、それが機能することだけを見たかったのです。そして、それはしました。次に、実際に塗りつぶされたピクセル数を知りたいと思いました。そのため、私のコードでは、戻り値の型をintに変更し、「ctr」変数を返しました。しかし、ctrは、実際に塗りつぶされたピクセル数の約2倍であることが判明しました(これらのピクセルをカウントすることを唯一の目的として、別の関数を作成しました。念のために)。

変数「ctr」が本来あるべき2倍にインクリメントされる方法と理由について、誰かが啓蒙できますか?

*ピクセルクラスは、ビットマップのピクセルのx、y、およびカラー値のコンテナとしてのみ機能します。

public Bitmap floodfill(Bitmap image, int x, int y, Color newColor)
{
    Bitmap result = new Bitmap(image.Width, image.Height);
    Stack<Pixel> pixels = new Stack<Pixel>();
    Color oldColor = image.GetPixel(x, y);
    int ctr = 0;

    pixels.Push(new Pixel(x, y, oldColor));

    while (pixels.Count > 0)
    {
        Pixel popped = pixels.Pop();

        if (popped.color == oldColor)
        {
            ctr++;
            result.SetPixel(popped.x, popped.y, newColor);

            pixels.Push(new Pixel(popped.x - 1, popped.y, image.GetPixel(x - 1, y));
            pixels.Push(new Pixel(popped.x + 1, popped.y, image.GetPixel(x + 1, y));
            pixels.Push(new Pixel(popped.x, popped.y - 1, image.GetPixel(x, y - 1));
            pixels.Push(new Pixel(popped.x, popped.y + 1, image.GetPixel(x, y + 1));
        }
    }

    return result;
}
4

2 に答える 2