c ++中的泛洪填充算法

时间:2011-03-07 23:11:25

标签: c++ algorithm stack

我正在尝试编写将对图像进行颜色填充的代码,而我正在使用Stacks。 (对于堆栈和队列来说还是新手,所以我不确定哪一个会更好)。无论如何,我认为我已经掌握了基本的想法,但是我的代码存在缺陷:

animation DFSfill(BMP& img, int x, int y, colorPicker & fillColor, int tolerance, int frameFreq) {


Stack<RGBApixel> s;
s.push(*img(x,y));
int actualTol;
int height, width;
width=img.TellWidth();
height=img.TellHeight();
int counter=1;
animation finalAnimation;
RGBApixel top;

bool visited[width][height];
for(int i=0;i<width;i++)
    for(int j=0;j<height;j++)
        visited[x][y]=false;



while(!s.isEmpty()){
    top = s.peek();
    s.pop();

    actualTol=(top.Red-fillColor(x,y).Red)^2
+(top.Blue-fillColor(x,y).Blue)^2+(top.Green-fillColor(x,y).Green)^2;

    //check 
    if(x<0 || x>=width)
        continue;
    if(y<0 || y>=height)
        continue;
    if (visited[x][y]==true)
        continue;
    if(actualTol>tolerance)
        continue;

    visited[x][y]=true;
    img(x,y)->Red=fillColor(x,y).Red;
    img(x,y)->Blue=fillColor(x,y).Blue;
    img(x,y)->Green=fillColor(x,y).Green;
    counter++;

    //visit adjacent nodes


    s.push(*img(x+1, y));//right

    s.push(*img(x, y-1));//down

    s.push(*img(x-1, y));//left

    s.push(*img(x, y+1));//up

    if((counter%frameFreq)==0)
        finalAnimation.addFrame(img);
}

return finalAnimation;  

}

所以我认为问题,或者至少对我来说,问题是当访问相邻节点时,我每个循环访问相同的节点,对吧?什么是解决方法呢?

1 个答案:

答案 0 :(得分:2)

在堆栈中,您应该保存坐标,而不是颜色。您无需保存*img(x+1,y),而只需保存x+1,y。您可以使用同时包含两个坐标的struct来执行此操作。

保存坐标可让您穿越您正在填充的区域。保存颜色并没有任何意义。

你可以通过一步一步地使用调试器进入代码来自己发现这个错误,看起来你正在进入堆栈以及它是什么从堆栈中走出来的。

在尝试实现算法之前对算法的充分理解也有帮助。为了理解这一点,您可以在一个小玩具示例中使用笔和纸手动运行算法。