我正在尝试实现简单的边界填充方法(使用 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();
}
输出:
但是当我使用以下矩形坐标时,它工作正常。给定坐标:
rectangle(50, 50, 100 ,100);
boundfill(55, 55, 4, WHITE);
为此,输出为:
最佳答案
您使用什么平台?
- 这是 32 位还是 16 位可执行文件?
BGI 是非常古老的 Borland gfx API,仍然用于学习目的,如果它是原始的 Borland BGI 那么您正在创建 16 位 DOS 应用程序。还有适用于 Windows 和 Linux 的 BGI 包装器/模拟器,在这种情况下,这取决于您的编译器设置。
可能出现什么问题:
堆/栈
在 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 局部变量可以是静态的。这将消除递归中的所有分配,仅保留返回地址。gfx 模式
BGI 主要用于跨越 64KB 障碍的更高分辨率的 16 色模式。如果您的 BGI 驱动程序出现问题,它可能会挂起或停止绘图。在这种情况下,无论项目符号 #1 是什么,停止都会发生在同一位置。为了避免这种更改 BGI 驱动程序,请使用不同的分辨率或更好的模拟器
关于c - 边界填充算法中途停止填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077969/