2

現在、練習用の小さなペイント プログラムを作成しています。今、私はペイント バケツ ツール、つまりフラッド フィルを実行しようとしています。おもしろいことに、埋めなければならないピクセルの数が少ない場合は、すべて正常に機能します。塗りつぶしピクセルのヘイト数が多い場合、SO-Exception が発生します。これが私のコードです:

private void FloodFill(Bitmap picture, int x, int y)
{
  if (x <= 0 || y <= 0 || x >= DrawingPanel.Width || y >= DrawingPanel.Height)
  {
    return;
  }

  if (picture.GetPixel(x, y) != löschFarbe)
  {
    return;
  }

  if (picture.GetPixel(x, y) == löschFarbe)
  {
    picture.SetPixel(x, y, ColorButton.BackColor);
  }

  FloodFill(picture, x + 1, y);
  FloodFill(picture, x, y + 1);
  FloodFill(picture, x - 1, y);
  FloodFill(picture, x, y - 1);
  FloodFill(picture, x + 1, y + 1);
  FloodFill(picture, x - 1, y + 1);
  FloodFill(picture, x + 1, y - 1);
  FloodFill(picture, x - 1, y - 1);
}

「löschFarbe」はクリックされた色です(別の色で消去/上書きされます)

エラーの発生: 全体像または大きなスペースを埋めたい場合、ここでエラーが発生します。

if (picture.GetPixel(x, y) != löschFarbe)
  {
    return;
  }

これを解決する方法を知っている人はいますか?

ところで、これは私のプログラムの写真です: ペイント

4

1 に答える 1

2

適度なサイズのフラッドフィルでさえ、コールスタックを爆破します。

この質問のように、この再帰ベースのメソッドをスタックベースのメソッドに変換してみてください。

于 2013-01-08T10:07:37.993 に答える