3

長方形を塗りつぶすための単純な境界塗りつぶし方法(4接続アプローチを使用)を実装しようとしています。私は次のようにしました (以下のコード) が、四角形が正しく塗りつぶされていません: 四角形の半分の部分に達すると、塗りつぶしが停止します。

しかし、円を塗りつぶそうとすると、同じコードが正常に機能します。誰でも問題を解決するのを手伝ってもらえますか?

前もって感謝します

#include <stdio.h>
#include <conio.h>
#include <graphics.h>

void boundfill(int xc, int yc, int r, int b) {
    int cur;
    cur = getpixel(xc, yc);
    if (cur != b && cur != r) {
        putpixel(xc, yc, r);
        delay(1);

        boundfill(xc + 1, yc, r, b);
        boundfill(xc - 1, yc, r, b);
        boundfill(xc, yc + 1, r, b);
        boundfill(xc, yc - 1, r, b);
    }
}

void main() {
    int gd = DETECT, gm;
    initgraph(&gd, &gm, "..\\bgi");

    rectangle(100, 100, 300, 300);
    boundfill(105, 105, 4, WHITE);

    getch();
    closegraph();
}

出力:

出力 1

しかし、長方形に次の座標を使用すると、正常に機能します。与えられた座標:

rectangle(50, 50, 100 ,100);
boundfill(55, 55, 4, WHITE);

このため、出力は次のとおりです。

アウトプット 2

4

2 に答える 2

0

どのプラットフォームを使用していますか?

  • これは 32 ビットまたは 16 ビットで実行可能ですか?

BGI は非常に古い Borland gfx API であり、元の Borland BGI を使用して 16 ビット DOS アプリを作成している場合、学習目的でまだ使用されています。Windows および Linux 用の BGI のラッパー/エミュレーターもあり、その場合はコンパイラーの設定に依存します。

何が間違っている可能性があります:

  1. ヒープ/スタック

    16 ビット DOS モードでは、システム全体で使用可能な 640​​KB のメモリ空間の最初の 1 MB だけを確認できます。プログラム/プロジェクト/コンパイラの設定には、アプリの初期/最大ヒープやスタック サイズなどの追加の制約があります。設定が低すぎると、ヒープ スタックに問題が発生する可能性があります。その場合、例外がスローされるはずですが、私の経験では、多くの見知らぬものと例外の欠落が見られます。

    100x100 ピクセル領域を埋める場合、最大 10000 回再帰し、再帰呼び出し (16 ビットの場合) には以下が含まれます。

    1 x return address segment+offset = 4 Byte
    4 x int16 operand = 8 Byte
    1 x int local variable = 2 Byte
    

    全部で 14 バイト (一部の C/C++ エンジンでは 16 バイトに切り捨てられます) putpixel のようなサブコールに必要な追加データをカウントしません ... 再帰カウントで乗算すると、16 ビット DOS で確実に安全性をはるかに上回ります。これを確認するには:

    • 充填は毎回同じ場所で停止する必要があります (コードにこれ以上処理がない場合)
    • 関数ヘッダーにいくつかの変数を追加すると、以前よりも早く停止するはずです
    • ヒープ/スタック制限の変更もこれに影響するはずです

    これを修復するには、再帰から不要なすべてのティントを排除します。たとえばb,r、定数であるため、グローバル変数に含めることができます。xc,yc返却前に元の状態に戻せばご利用いただけます&xc,&yc。cur ローカル変数は静的にすることができます。これにより、再帰のすべての割り当てが削除され、戻りアドレスのみが残ります。

  2. gfx モード

    BGI は主に、64KB の壁を超える高解像度の 16 カラー モードに使用されます。BGI ドライバーに何か問題がある場合、ハングアップしたり、描画を停止したりする可能性があります。その場合、弾丸#1に関係なく、停止は同じ場所で発生します。この BGI ドライバーの変更を回避するには、別の解像度またはより優れたエミュレーターを使用してください

于 2014-09-29T08:01:30.597 に答える