我编写了这个函数来填充闭环,像素是全局声明的,以存储像素的颜色值,第一次单击将在其中完成(在闭环中)。
但问题是,当第一个*填充(.,.)*结束时,这个递归并没有终止,它说堆栈溢出了……
void fill(int x,int y)
{
GLfloat pixval[3];
glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,pixval);
if(pixval[0]==pixvali[0] && pixval[1]==pixvali[1] && pixval[2]== pixvali[2])
{
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
glFlush();
fill(x-1,y);
fill(x+1,y);
fill(x,y-1);
fill(x,y+1);
}
}发布于 2009-05-24 12:47:39
实现您自己的堆栈,不要使用递归来填充洪水,除非您正在用相对较小的象素填充形状。
一个典型的实现是:
Stack stack;
stack.push(firstPoint);
while(!stack.isEmpty()){
Point currentPoint= stack.pop();
//do what ever you want to do here, namely paint.
//boundary check ur surrounding points and push them in the stack if they are inbounds
}发布于 2009-05-24 12:21:58
堆栈溢出是因为您正在使用递归,并且递归的深度与所填充形状中的像素数成线性关系。
这也可能是,你试图填补形状相同的颜色,因为它已经是。也就是说,当前的gl颜色与像素值相同。在这种情况下,您将得到无限递归。
发布于 2009-05-24 12:28:44
从问题中很难分辨,但我猜,你会开始像像素一样循环。
例如,假设只有4个像素需要着色(0,0),(0,1),(1,0),(1,1)。
开始着色(0,0)。然后递归将进入(1,0),因为(-1,0)不需要着色。然后再次(0,0),因为它是像素,也就是(x-1,y),等等。
您需要添加某种方式来标记已经着色的像素。但这只是猜测,因为你不能真正看到函数之外发生了什么。
https://stackoverflow.com/questions/903642
复制相似问题