c - 边界填充算法中途停止填充

标签 c bgi turbo-c

我正在尝试实现简单的边界填充方法(使用 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();
}

输出:

Output 1

但是当我使用以下矩形坐标时,它工作正常。给定坐标:

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

为此,输出为:

Output 2

最佳答案

您使用什么平台?

  • 这是 32 位还是 16 位可执行文件?

BGI 是非常古老的 Borland gfx API,仍然用于学习目的,如果它是原始的 Borland BGI 那么您正在创建 16 位 DOS 应用程序。还有适用于 Windows 和 Linux 的 BGI 包装器/模拟器,在这种情况下,这取决于您的编译器设置。

可能出现什么问题:

  1. 堆/栈

    在 16 位 DOS 模式下,您只能看到前 1 MB 内存空间,其中 640KB 可供整个系统使用。在您的程序/项目/编译器设置中,还有其他约束,例如应用程序的初始/最大堆和堆栈大小。如果设置得太低,那么您可能会遇到堆堆栈问题,在这种情况下它应该抛出异常,但根据我的经验,我看到很多奇怪的事情,然后丢失异常。

    当您填充 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 驱动程序,请使用不同的分辨率或更好的模拟器

关于c - 边界填充算法中途停止填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077969/

相关文章:

linker - 使用 Turbo C 编译并链接到 .com 文件

c - 在 Turbo C 中覆盖背景的移动对象

c - "__aeabi_ldivmod"编译内核模块时未定义

c - 为什么我的程序不能运行?

c - 将更大的字符串存储到 arr[num]

c - 如果源代码在 win32 中是 UTF-8 编码的,如何显示 UTF-16 const 字符串?

c++ - 如何在代码块中使用 graphics.h?

c++ - CodeLite 中的graphics.h?

c - 当 0xFF 在 char 数组中时,它与下一个 char 一起被读取为整数

c++ - C++中的多重定义错误