gpt4 book ai didi

c - C 中的边界填充算法不起作用(计算机图形学 - C 编程)

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:32 25 4
gpt4 key购买 nike

我正在尝试实现用于填充矩形的简单边界填充方法(使用 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 的内存空间,其中 640 KB 可用于整个系统。在您的程序/项目/编译器设置中,还有其他限制,例如应用程序的初始/最大堆和堆栈大小。如果设置得太低,那么你可能会遇到堆堆栈问题,在这种情况下它应该抛出异常,但根据我的经验,我看到了很多奇怪的事情然后丢失了异常。

    当您填充 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 - C 中的边界填充算法不起作用(计算机图形学 - C 编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com