## OpenGL program to develop a menu driven program to fill the polygon using scan line algorithm

Objective: In this program the students will learn to apply scan-line area filling algorithm to fill a polygon using OpenGL functions.

Input: Provide the eight vertices to draw the polygon.

Output: Polygon filled by coloring all its pixels.

Algorithm:
Step 1: Start
Step 2: Initiate the scan from the bottom of the polygon.
Step 3: For each Scan Line

• Find the intersection of the scan line with each edge of the polygon.
• Sort the intersection by increasing ‘x’ co-ordinates.
• Fill all the pixels between pair of intersection.

Step 4: Go to step2 until top of the polygon is filled by coloring all its pixels.

Step 5: Stop

				
#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <windows.h>
float x1,x2,x3,x4,y1,y2,y3,y4;
int fillFlag=0;
void edgedetect(float x1,float y1,float x2,float y2,int *le,int *re)
{
float mx,x,temp;
int i;
if((y2-y1)<0)
{
temp=y1;
y1=y2;
y2=temp;
temp=x1;
x1=x2;
x2=temp;
}
if((y2-y1)!=0)
mx=(x2-x1)/(y2-y1);
else
mx=x2-x1;
x=x1;
for(i=y1;i<=y2;i++)
{
if(x<(float)le[i])
le[i]=(int)x;
if(x>(float)re[i])
re[i]=(int)x;
x+=mx;
}
}
void draw_pixel(int x,int y)
{
glColor3f(1.0,1.0,0.0);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
void scanfill(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)
{
int le[500],re[500];
int i,y;
for(i=0;i<500;i++)
{
le[i]=500;
re[i]=0;
}
edgedetect(x1,y1,x2,y2,le,re);
edgedetect(x2,y2,x3,y3,le,re);
edgedetect(x3,y3,x4,y4,le,re);
edgedetect(x4,y4,x1,y1,le,re);
for(y=0;y<500;y++)
{
for(i=(int)le[y];
i<(int)re[y];i++)
draw_pixel(i,y);
}
}
void display()
{
x1=200.0;
y1=200.0;
x2=100.0;
y2=300.0;
x3=200.0;
y3=400.0;
x4=300.0;
y4=300.0;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_LINE_LOOP);
glVertex2f(x1,y1);
glVertex2f(x2,y2);
glVertex2f(x3,y3);
glVertex2f(x4,y4);
glEnd();
if(fillFlag==1)
scanfill(x1,y1,x2,y2,x3,y3,x4,y4);
glFlush();
}
void init()
{
glClearColor(0.0,0.0,0.0,1.0);
glColor3f(1.0,0.0,0.0);
glPointSize(1.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,499.0,0.0,499.0);
}
{
if(option==1)
fillFlag=1;
if(option==2)
fillFlag=2;
display();
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("Filling a Polygon using Scan-line Algorithm");
init();
glutDisplayFunc(display);