洪水填充算法

时间:2010-05-07 15:39:31

标签: opengl

我想实现洪水填充algorthm ...所以当我得到一个点的x和y co-od时......它应该从该点开始泛滥并填充直到它找到一个边界但它不是填满整个地区...说五角大楼 这是我正在使用的代码

void setpixel(struct fill fillcolor,int x,int y)
{
     glColor3f(fillcolor.r,fillcolor.g,fillcolor.b);
     glBegin(GL_POINTS);
     glVertex2i(x,y);
     glEnd();
     glFlush();
}

struct fill getpixcol(int x,int y)
{
    struct fill gotpixel;
    glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_BYTE,pick_col);
    gotpixel.r =(float) pick_col[0]/255.0;
    gotpixel.g =(float) pick_col[1]/255.0;
    gotpixel.b =(float) pick_col[2]/255.0;
    return(gotpixel);
}

void floodFill(int x, int y,struct fill fillcolor,struct fill boundarycolor)
{
    struct fill tmp;
    //    if ((x < 0) || (x >= 500)) return;
    // if ((y < 0) || (y >= 500)) return;
    tmp=getpixcol(x,y);
    while (tmp.r!=boundarycolor.r && tmp.g!=boundarycolor.g && tmp.b!=boundarycolor.b)
    {
           setpixel(fillcolor,x,y);
           setpixel(fillcolor,x+1,y);
           setpixel(fillcolor,x,y+1);
           setpixel(fillcolor,x,y-1);
           setpixel(fillcolor,x-1,y);
           floodFill(x-1,y+1,fillcolor,boundarycolor);
           floodFill(x-1,y,fillcolor,boundarycolor);
           floodFill(x-1,y-1,fillcolor,boundarycolor);
           floodFill(x,y+1,fillcolor,boundarycolor);
           floodFill(x,y-1,fillcolor,boundarycolor);
           floodFill(x+1,y+1,fillcolor,boundarycolor);
           floodFill(x+1,y,fillcolor,boundarycolor);
           floodFill(x+1,y-1,fillcolor,boundarycolor);
     }
}

2 个答案:

答案 0 :(得分:2)

我不能说这是不是问题,但你要比较浮点数,这是一个浮点数,不是没有。当您向OpenGL绘制颜色并将其读回0-1范围时,它可能不是相同的数字。您可能希望仅使用整数来尝试比较。

答案 1 :(得分:1)

您不应为每个像素发出读取像素和写入像素。这死得很慢!

而是将所有像素读入主机内存,在主机内存中操作溢出并将所有像素写回帧缓冲区(或纹理)。