0

Im stuck in this bunch of codes...i cant get the pixel to fill up the circle??...any help

#include<iostream>
#include<glut.h>

struct Color{
    float red, green, blue;
};

Color getPixel(int x, int y){           // gets the color of the pixel at (x,y) 
    Color c;
    float color[4];
    glReadPixels(x,y,1,1,GL_RGBA, GL_FLOAT, color);
    c.red = color[0];   
    c.green = color[1];     
    c.blue = color[2];  
    return c;
}

void setPixel(int x, int y, Color c){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushAttrib(GL_ALL_ATTRIB_BITS);
    glColor3f(c.red, c.green, c.blue);
    glBegin(GL_POINTS);
    glVertex2i(x,y);
    glEnd();
    glPopAttrib();
    glFlush();
}

void init()
     {
        glClearColor(1.0,1.0,1.0,0.0);
        gluOrtho2D(0.0,300.0,0.0,300.0);
     }

void drawPixel(int x,int y)
{
    glBegin(GL_POINTS);
    glVertex2i(x,y);
    glEnd();
    glFlush();
}

void Boundary_fill(int x,int y,Color thisColor){
    Color boundary_color;
    boundary_color.red=0.0;
    boundary_color.green=1.0;
    boundary_color.blue=0.0;
    Color nextpixel=getPixel(x,y);
    if((nextpixel.red!=boundary_color.red)&&(nextpixel.blue!=boundary_color.blue)&&(nextpixel.green!=boundary_color.green) && (nextpixel.red!=thisColor.red)&& (nextpixel.blue!=thisColor.blue)&& (nextpixel.green!=thisColor.green)){
        setPixel(x,y,thisColor);
        Boundary_fill((x+1),y,thisColor);
        Boundary_fill((x-1),y,thisColor);
        Boundary_fill(x,(y+1),thisColor);
        Boundary_fill(x,(y-1),thisColor);
    }

}

void draw(int x1,int y1, int x, int y){
    drawPixel(x1+x,y1+y);//quadrant1
    drawPixel(x1+x,y1-y);//quadrant2
    drawPixel(x1-x,y1+y);//quadrant3
    drawPixel(x1-x,y1-y);//quadrant4
    drawPixel(x1+y,y1+x);//quadrant5
    drawPixel(x1+y,y1-x);//quadrant6
    drawPixel(x1-y,y1+x);//quadrant7
    drawPixel(x1-y,y1-x);//quadrant8
}

void circle(int px,int py,int r){
    int a,b;
    float p;
    a=0;
    b=r;
    p=(5/4)-r;

    while(a<=b){
        draw(px,py,a,b);
        if(p<0){
            p=p+(2*a)+1;
        }
        else{
            b=b-1;
            p=p+(2*a)+1-(2*b);
        }
        a=a+1;
    }
}


void Circle(void)
{
    Color thisColor;
    thisColor.red=1.0;
    thisColor.blue=0.0;
    thisColor.green=0.0;

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0,1.0,0.0);
    glPointSize(2.0);
    int x0 = 100;
    int y0 = 150;
    circle(x0,y0,50);
    glColor3f(thisColor.red,thisColor.blue,thisColor.green);
    Boundary_fill(x0,y0,thisColor);
}

void main(int argc, char**argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(400,400);
    glutInitWindowPosition(1,1);
    glutCreateWindow("Boundary fill in a circle:Taaseen And Abhinav");
    init();
    glutDisplayFunc(Circle);
    glutMainLoop();
}
C. Ross
  • 31,137
  • 42
  • 147
  • 238
Taaseen
  • 1
  • 1
  • 1
  • 1
    Could you edit this so that the entire code segment displays as code? You just need to indent all code lines by four spaces. Also, what language are you using? – Pops Nov 09 '09 at 18:36
  • Looks like C, though the tag says C++. And he seems to be using OpenGL. – Don Wakefield Nov 09 '09 at 18:48
  • The flood fill itself looks sound although doing read/write pixel ops in OGL is a little scary... I would suspect either the getPixel() function or the float comparison on the result... – Aaron Nov 09 '09 at 18:53

1 Answers1

1

Your setPixel() routine is broken. It clears the window to white, thereby erasing all previously drawn pixels. You should remove this line and put it in your Circle() routine instead:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Because of that line, getPixel() will always read white pixels (except for one) and will recurse to the right. If you're lucky glReadPixels() will return some random colors when reaching the outside of the frame buffer. Otherwise it will produce a stack overflow. You should therefore also check your pixel position in Boundary_fill().

Mykola
  • 3,343
  • 6
  • 23
  • 39
kolrabi
  • 11
  • 1