C中的油漆桶

时间:2012-07-02 17:47:34

标签: c++ c paint borland-c++

我需要帮助..我正在制作一个模仿油漆桶的功能..当一半图像被着色时出现问题这个错误发生“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上运行它

2 个答案:

答案 0 :(得分:1)

我会想到甜甜圈的美元,你正在炸掉你的筹码。 NTVM是Windows的dos模拟器。我猜它有一个有限的堆栈。尝试寻址堆栈外部的内存(可寻址范围)会导致非法指令。这也可以解释为什么你只能获得大图片。

答案 1 :(得分:1)

在您运行的代码中,递归永远不会结束......当存储桶到达图像的边界(顶部,底部,左侧或右侧)时,您应该停止递归。

还有另一个问题:每次调用函数都会调用其他四个函数。这意味着即使您为图像边框添加特殊if,递归也永远不会结束,因为例如像素(x,y)上的桶调用bucket(x + 1,y)和像素(x + 1,y)上的桶调用存储桶(x-1,y)实际上是像素(x,y)!

我的建议是添加特殊的函数参数,比如,, direction''。考虑四个方向:N,E,W和S.第一次调用桶调用4个桶,但这次是方向。方向== N的函数在S方向上不着色。您可以使用0(第一次调用无方向)的整数值,方向符号最多4个。

当然,我的想法需要进一步开发以优化代码(条件应该更好地说明,因此我们不会多次访问相同的像素。)