алгоритм заливки - PullRequest
1 голос
/ 07 мая 2010

Я хочу реализовать алгоритм заливки заливки ... так что, когда я получу x и y-код точки ... она должна начать заливку с этой точки и заполнять, пока не найдет границу, но это не так заполняя весь регион ... скажем, пятиугольник это код, который я использую

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 ]

2 голосов
/ 07 мая 2010

Я не могу сказать, является ли это проблемой или нет, но вы сравниваете числа с плавающей запятой, которые с плавающей запятой нет, нет. Когда вы рисуете цвет в OpenGL и читаете его обратно в диапазон 0-1, это может быть не то же самое число. Вы можете попробовать свои сравнения, используя только целые числа.

1 голос
/ 08 мая 2010

Вы не должны выдавать пиксель чтения и записи для каждого пикселя. Это очень медленно!

Вместо этого считывайте все пиксели в память хоста, выполняйте заливку в памяти хоста и записывайте все пиксели обратно в буфер кадров (или текстуру).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...