0

ヘルプが必要です..ペイントでバケツを模倣する関数を作成しています..画像の半分が色付けされている場合に問題が発生しますこのエラーは「NTVMが不正な命令に遭遇しました」が発生します

これが私の「バケット」コードです。

void bucket(int x, int y, int fillColor)
{

 if(getpixel(x,y)==getpixel(x,y+1)){
     putpixel(x,y,fillColor);
     bucket(x,y+1,fillColor);
 }


 if(getpixel(x,y)==getpixel(x+1,y)){
     putpixel(x,y,fillColor);
     bucket(x+1,y,fillColor);
 }


 if(getpixel(x,y)==getpixel(x,y-1)){
     putpixel(x,y,fillColor);
     bucket(x,y-1,fillColor);
 }


 if(getpixel(x,y)==getpixel(x-1,y)){
     putpixel(x,y,fillColor);
     bucket(x-1,y,fillColor);
 }


}

おそらく、「塗りつぶし」アルゴリズムの問​​題は、再帰のスタックがすべての呼び出しをサポートしていないことです...図面の少なくとも半分が色付けされています。

PS:Borland c++v3.1で

4

2 に答える 2

1

実行しているコードでは、再帰は決して終了しません...バケットが画像の境界(上、下、左、または右)に到達したら、再帰を停止する必要があります。

別の問題もあります。関数の呼び出しごとに、他の 4 つの関数が呼び出されます。つまり、画像の境界線に特別な if を追加しても、再帰が終了しないことを意味します。たとえば、ピクセル (x,y) のバケットはbucket(x+1,y) を呼び出し、ピクセル (x+1,y) のバケットはバケットを呼び出すためです。 (x-1,y) これは実際にはピクセル (x,y) です!

あなたへの私のアドバイスは、,,direction のような特別な関数引数を追加することです。N、E、W、S の 4 つの方向を考えます。バケットの最初の呼び出しは 4 つのバケットを呼び出しますが、今回は方向があります。direction==N の関数は、S 方向に色を付けません。方向記号には、0 (最初の呼び出しでは方向なし) から 4 までの整数値を使用できます。

もちろん、コードを最適化するには、私のアイデアをさらに発展させる必要があります (同じピクセルに複数回アクセスしないように、条件をより適切に記述する必要があります)。

于 2012-07-02T21:24:57.613 に答える
1

私はドーナツにドルを推測します、あなたはあなたのスタックを爆破しています. NTVM は Windows 用の DOS エミュレーターです。スタックが限られていると思います。スタック (アドレス可能な範囲) の外側のメモリをアドレス指定しようとすると、不正な命令が発生します。これは、大きな写真に対してのみ取得する理由も説明します.

于 2012-07-02T17:54:25.900 に答える