洪水填充算法运行缓慢

lap*_*ots 0 opengl

我有flood fill算法代码.

void floodFill() {
    float target[3] = { 1.0, 1.0, 0.0 };
    float border[3] = { 1.0, 1.0, 1.0 };
    float clearp[3] = { 0.0, 0.0, 0.0 };
    std::stack<pixel*> colored;
    if (!stack.empty()) // stack contains first pixel
        colored.push(stack.top());

    while(!colored.empty()) {

        pixel *p = colored.top();
        drawPixel(p->x, p->y, target);
        colored.pop();

        //up
        float pix[3];
        glReadPixels(p->x, p->y + KOEF, 1, 1, GL_RGB, GL_FLOAT, pix);
        if (!compare(pix,border) && compare(pix,clearp)) {
            pixel *pn = new pixel();
            pn->x = p->x;
            pn->y = p->y + KOEF;
            colored.push(pn);
        }
        //down
        glReadPixels(p->x, p->y - KOEF, 1, 1, GL_RGB, GL_FLOAT, pix);
        if (!compare(pix,border) && compare(pix,clearp)) {
            pixel *pn = new pixel();
            pn->x = p->x;
            pn->y = p->y - KOEF;
            colored.push(pn);
        }

        //left
        glReadPixels(p->x - KOEF, p->y, 1, 1, GL_RGB, GL_FLOAT, pix);
        if (!compare(pix,border) && compare(pix,clearp)) {
            pixel *pn = new pixel();
            pn->x = p->x - KOEF;
            pn->y = p->y;
            colored.push(pn);
        }

        //right
        glReadPixels(p->x + KOEF, p->y, 1, 1, GL_RGB, GL_FLOAT, pix);
        if (!compare(pix,border) && compare(pix,clearp)) {
            pixel *pn = new pixel();
            pn->x = p->x + KOEF;
            pn->y = p->y;
            colored.push(pn);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我使用这种方法绘制像素

void drawPixel(float x, float y, float *t) {
glRasterPos2i(x, y); 
glDrawPixels(1, 1, GL_RGB, GL_FLOAT, t);
for(int i = 0; i < KOEF; i++) {

    glRasterPos2i(x, y + i); 
    glDrawPixels(1, 1, GL_RGB, GL_FLOAT, t);

    glRasterPos2i(x + i, y); 
    glDrawPixels(1, 1, GL_RGB, GL_FLOAT, t);

    glRasterPos2i(x + i, y + i); 
    glDrawPixels(1, 1, GL_RGB, GL_FLOAT, t);
}
};
Run Code Online (Sandbox Code Playgroud)

为了填充某些区域,我选择第一个像素,然后单击鼠标,然后调用方法floodFill.

void mouse(int button, int state, int x, int y) {

if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
    pixel *p = new pixel();
    p->x = x;
    p->y = HEIGHT - y;
    if (!stack.empty())
        stack.pop();
    stack.push(p); // first pixel

    floodFill();
}
};
Run Code Online (Sandbox Code Playgroud)

结果是(例如)

在此输入图像描述

但它的工作速度非常慢(几秒钟.图片上的区域 - 它画了11秒.字母周围的区域 - 43秒).而且我认为它会慢慢地逐像素地绘制,但是它等待了几秒钟,然后我看到了结果.

我的电脑是

intel core 2 duo p8600 2.4 GHz
nvidia 9600m gt 512 mb
windows x86 
ram 4 GB(3)`
Run Code Online (Sandbox Code Playgroud)

它应该工作得如此之慢还是有问题?

gen*_*ult 6

这是使用OpenGL 的一种可怕方式.

将洪水填充到主机内存中,将生成的位图上传到OpenGL纹理,然后使用该纹理渲染四边形.