C++ 填海工程

C++ 填海工程,c++,2d,flood-fill,C++,2d,Flood Fill,我的洪水填充功能有问题: void floodfill(int x, int y,Pixel old, Pixel new){ Pixel current = getPixel(x,y); if(current.r == old.r && current.g == old.g && current.b == old.b){ setPixel(x,y,new); floodfill(x+1,y,old,new); floodfill(

我的洪水填充功能有问题:

void floodfill(int x, int y,Pixel old, Pixel new){

Pixel current = getPixel(x,y);

if(current.r == old.r && current.g == old.g && current.b == old.b){

    setPixel(x,y,new);

    floodfill(x+1,y,old,new);
    floodfill(x-1,y,old,new);
    floodfill(x,y+1,old,new);
    floodfill(x,y-1,old,new);
    floodfill(x+1,y+1,old,new);
    floodfill(x-1,y-1,old,new);
    floodfill(x+1,y+1,old,new);
    floodfill(x-1,y+1,old,new);
}
}

在结构“像素”中,我有像素的rgb值。我正在尝试填充一个正方形,当我到达正方形的边界时(颜色从白色变为黑色,边界在x=200点),函数没有改变到其他像素,只是无休止地将x值改变到198和199(不管y值如何)。有人能告诉我我做错了什么吗?

一个可能的问题是,您填写了两次
(x+1,y+1)
,但缺少
(x+1,y-1)


这听起来好像setPixel没有将(x,y)的颜色设置为“新”。因此,发生的是以下递归调用序列:

(199,y)->(200,y)[此操作停止,因为边框的颜色与旧边框的颜色不同]
->(198,y)->(199,y)[(199,y)被调用,因为setPixel可能没有更改(199,y)的颜色]->……

只有当当前颜色等于旧颜色时,才进行填充。是否仅当当前颜色不等于旧颜色时才填充?P.S- <代码>新< /COD>是C++中的保留关键字,因此不应尝试使用它作为变量名。如果<新> <代码>等于“代码>旧< /代码>?”代码>新< /COD>是C++中的关键字;不能将其用于变量名。Aardvarkk,正方形内部为白色,边框为黑色。我将旧颜色设置为白色,我想设置像素并在当前颜色为白色时开始递归。当我到达正方形的边界时,电流变为黑色。谢谢你纠正我的错误,但就在第一次填充(x+1,y)我的程序循环之后。你是说你的程序进入无限循环还是其他什么?我假设你的正方形边框有一个完整的实心轮廓,包括用旧颜色填充的角落?是的,无限循环,正方形边框是实心黑色,角落也是黑色的(里面的正方形是白色的)。你使用什么样的系统?
setPixel()
是否实际设置了像素的颜色,或者是否存在可能干扰后续
getPixel()
调用的缓冲层?我对函数进行了快速测试,并通过上述修复,将
new
更改为
newColor
,效果良好(使用虚拟像素屏幕)。这意味着可能的罪魁祸首与
setPixel()/getPixel()
函数有关。
floodfill(x+1,y,old,new);
floodfill(x-1,y,old,new);
floodfill(x,y+1,old,new);
floodfill(x,y-1,old,new);
floodfill(x+1,y+1,old,new);
floodfill(x+1,y-1,old,new); //Missing this case
floodfill(x-1,y+1,old,new);
floodfill(x-1,y-1,old,new);