Program:
#include<GL/glut.h>
void init()
{
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1,1,1,0);
gluOrtho2D(0,500,0,500);
}
int line_cordinates[4],co_i;
void plotPixel(int x,int y,float *fill_color)
{
glColor3f(fill_color[0],fill_color[1],fill_color[2]);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
glFlush();
}
// Boundary Fill Algoritm
void boundaryfill(int x,int y,float *fill_color,float *boundary_color)
{
float current[3];
glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,current);
if( (current[0] != boundary_color[0] || current[1] != boundary_color[1] || current[2] != boundary_color[2]) &&
(current[0] != fill_color[0] || current[1] != fill_color[1] || current[2] != fill_color[2]))
{
plotPixel(x,y,fill_color);
boundaryfill(x+1,y,fill_color,boundary_color);
boundaryfill(x,y+1,fill_color,boundary_color);
boundaryfill(x-1,y,fill_color,boundary_color);
boundaryfill(x,y-1,fill_color,boundary_color);
}
}
// DDA Line Drawing Algoritm
void ddaAlgo(int x1,int y1,int x2,int y2)
{
float dx = x2-x1,dy = y2-y1;
float m = dy/dx;
float steps;
if(abs(dx) > abs(dy))
steps = abs(dx);
else
steps = abs(dy);
float xinc = dx/steps;
float yinc = dy/steps;
float x=x1,y=y1;
for(int i=1;i<=steps;i++)
{
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
x = x +xinc;
y = y + yinc;
}
glFlush();
}
// Bresenham's Line Drawing Algorithm
void bsaAlgo(int x1,int y1,int x2,int y2)
{
float dy = y2-y1;
float dx = x2 -x1;
float m = dy/dx;
float p;
float x = x1, y = y1;
int x_change = 1, y_change = 1;
if(x1>x2)
x_change = -1;
if(y1>y2)
y_change = -1;
if(dx < 0)
dx = -dx;
if(dy < 0)
dy = -dy;
glBegin(GL_POINTS);
if(dx>dy)
{
p = 2*dy-dx;
for(int i=0;i<dx;i++)
{
if(p<0)
{
p = p + 2*dy;
}
else
{
y = y + y_change;
p = p + 2 * (dy - dx);
}
x = x + x_change;
glVertex2i(x,y);
}
}
else
{
p = 2*dx-dy;
for(int i=0;i<dy;i++)
{
if(p<0)
{
p = p + 2*dx;
}
else
{
x = x + x_change;
p = p + 2*(dx - dy);
}
y = y + y_change;
glVertex2i(x,y);
}
}
glEnd();
glFlush();
}
void display()
{
//glPointSize(4);
glColor3f(1,0,0);
bsaAlgo(100,100,200,100);
bsaAlgo(300,100,400,100);
bsaAlgo(400,100,400,400);
bsaAlgo(400,400,100,400);
bsaAlgo(100,400,100,100);
bsaAlgo(200,100,160,50);
bsaAlgo(160,50,340,50);
bsaAlgo(340,50,300,100);
bsaAlgo(180,200,200,140);
bsaAlgo(200,140,300,260);
bsaAlgo(300,260,360,140);
// Inside Window
bsaAlgo(140,140,360,140);
bsaAlgo(360,140,360,360);
bsaAlgo(360,360,140,360);
bsaAlgo(140,360,140,140);
bsaAlgo(140,140,180,200);
float boundary_color[3],fill_color[3];
// Setting boundary color as RED
boundary_color[0] = 1;
boundary_color[1] = 0;
boundary_color[2] = 0;
// Fill Color to Green
fill_color[0] = 0;
fill_color[1] = 1;
fill_color[2] = 0;
boundaryfill(144,142,fill_color,boundary_color);
boundaryfill(204,142,fill_color,boundary_color);
// Fill Color to Light Blue
fill_color[0] = 0;
fill_color[1] = 1;
fill_color[2] = 1;
boundaryfill(102,102,fill_color,boundary_color);
glFlush();
}
void mouse(int button,int state,int x,int y)
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && co_i <4)
{
line_cordinates[co_i] = x;
co_i++;
line_cordinates[co_i] = 500-y;
co_i++;
}
if(co_i == 4)
{
ddaAlgo(line_cordinates[0],line_cordinates[1],line_cordinates[2],line_cordinates[3]);
co_i = 0;
}
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitWindowSize(500,500);
glutInitWindowPosition(150,200);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("Hill Fill");
init();
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
Output:
