我正在尝试编写将对图像进行颜色填充的代码,而我正在使用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;
}
所以我认为问题,或者至少对我来说,问题是当访问相邻节点时,我每个循环访问相同的节点,对吧?什么是解决方法呢?
答案 0 :(得分:2)
在堆栈中,您应该保存坐标,而不是颜色。您无需保存*img(x+1,y)
,而只需保存x+1,y
。您可以使用同时包含两个坐标的struct
来执行此操作。
保存坐标可让您穿越您正在填充的区域。保存颜色并没有任何意义。
你可以通过一步一步地使用调试器进入代码来自己发现这个错误,看起来你正在进入堆栈以及它是什么从堆栈中走出来的。
在尝试实现算法之前对算法的充分理解也有帮助。为了理解这一点,您可以在一个小玩具示例中使用笔和纸手动运行算法。