4路洪水填充功能,不通过起始颜色

时间:2015-02-23 22:50:59

标签: c++ recursion flood-fill

我需要编写一个递归泛洪填充函数,原型如下所示:

bool fill(PixMap& image,Pixel fillColour,int x, int y)

图像是“图像”部分将被填充,fillColour是用于填充图片的某个区域的颜色。将填充的第一个像素的x和y坐标。问题是我在网上找到的算法还包括oldColor变量,或者起始像素所具有的原始颜色。如果要填充颜色的像素与原始颜色不同,则递归停止。

    void floodFill4(int x, int y, int newColor, int oldColor) 
{ 
    if(x >= 0 && x < w && y >= 0 && y < h && screenBuffer[x][y] == oldColor && screenBuffer[x][y] != newColor) 
    { 
        screenBuffer[x][y] = newColor; //set color before starting recursion

        floodFill4(x + 1, y,     newColor, oldColor);
        floodFill4(x - 1, y,     newColor, oldColor);
        floodFill4(x,     y + 1, newColor, oldColor);
        floodFill4(x,     y - 1, newColor, oldColor);
    }     
}

然而,在我的原型中没有这样的变量,我不允许改变它。如何进行不会溢出所有图像的递归泛滥填充?

1 个答案:

答案 0 :(得分:1)

想想函数原型说的是什么:

使用fillColor以x / y填充图像。

它没有说:

fillColor时,使用oldColor以x / y填充图片,否则不执行任何操作。

后者是你的floodfill4原型。当floodfill4被调用时,它不确定是否会发生填充,因为它首先必须检查。

另一方面,您的目标原型将始终填充 - 这就是为什么它不需要oldColor

长话短说:不要测试旧颜色一次,而是这样做:

if pixel at x/y is fillColor:
    return
save oldColor at x/y
replace pixel at x/y with fillColor

for all neighboring pixels:
    if pixel at neighbor is oldColor:
        recursive call