Tuesday, October 27, 2020

Scanline Polygon Fill Algorithm

 


#include<GL/glut.h>

#include<stdio.h>

float x1,x2,x3,x4,y1,y2,y3,y4;


void draw_pixel(int x,int y)

{

    glColor3f(0.0,1.0,1.0);

    glPointSize(1.0);

    glBegin(GL_POINTS);

    glVertex2i(x,y);

    glEnd();

}


void edgedetect(float x1,float y1,float x2,float y2,int *le,int *re)

{

    float temp,x,mx;

    int i;


    if(y1>y2)

    {

        temp=x1,x1=x2,x2=temp;

        temp=y1,y1=y2,y2=temp;

    }


    if(y1==y2)

        mx=x2-x1;

    else

        mx=(x2-x1)/(y2-y1);


    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 scanfill(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)

{

    int le[500],re[500],i,j;


    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(j=0;j<500;j++)

    {

        if(le[j]<=re[j])

            for(i=le[j];i<re[j];i++)

                draw_pixel(i,j);

    }

}



void display()

{

    //x1=250.0;y1=200.0;x2=150.0;y2=300.0;x3=250.0;

    //y3=400.0;x4=350.0;y4=300.0;

    x1=50.0;y1=300.0;x2=300.0;y2=250.0;x3=250.0;

    y3=70.0;x4=70.0;y4=90.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();


    scanfill(x1,y1,x2,y2,x3,y3,x4,y4);


    glFlush();

}



void init()

{

    glClearColor(1.0,1.0,1.0,1.0);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    gluOrtho2D(0.0,499.0,0.0,499.0);

}


int main(int argc,char **argv)

{

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

    glutInitWindowSize(500,500);


    glutCreateWindow("Scanline polgon fill algorithm");

    glutDisplayFunc(display);


    init();

    glutMainLoop();

    return 0;

}

Output:



No comments:

Post a Comment

How can I run a C++ program directly from Windows?

How-can-I-run-a-C-program-directly-from-Windows