5. Clip lines using Cohen-Sutherland algorithm
#include<stdio.h>
#include<GL/glut.h>
#define true 1;
#define false 0;
#define bool int;
double x,y;
int xmin=50,xmax=100,ymin=50,ymax=100;
const int RIGHT=8,LEFT=2,TOP=4,BOTTOM=1;
int outcode0,outcode1,outcodeout,done,accept;
int computeoutcode(double x,double y)
{
int code=0;
if(y>ymax)
code|=TOP;
else if(y<ymin)
code|=BOTTOM;
if(x>xmax)
code|=RIGHT;
else if(x<xmin)
code|=LEFT;
return code;
}
void LineClip(double x0,double y0,double x1,double y1)
{
int accept=false;
int done=false;
outcode0=computeoutcode(x0,y0);
outcode1=computeoutcode(x1,y1);
do{
if(!(outcode0|outcode1))
{
accept=true;
done=true;
}
else if(outcode0&outcode1)
{
done=true;
}
else
{
outcodeout=outcode0?outcode0:outcode1;
if(outcodeout & TOP)
{
x=x0+(x1-x0)*(ymax-y0)/(y1-y0);
y=ymax;
}
else if(outcodeout & BOTTOM)
{
x=x0+(x1-x0)*(ymin-y0)/(y1-y0);
y=ymin;
}
else if(outcodeout & RIGHT)
{
y=y0+(y1-y0)*(xmax-x0)/(x1-x0);
x=xmax;
}
else
{
y=y0+(y1-y0)*(xmin-x0)/(x1-x0);
x=xmin;
}
if(outcodeout==outcode0)
{
x0=x;y0=y;outcode0=computeoutcode(x0,y0);
}
else
{
x1=x;y1=y;outcode1=computeoutcode(x1,y1);
}
}
}while(!done);
if(accept)
{
glPushMatrix();
glTranslatef(100,100,0);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2i(50,50);
glVertex2i(100,50);
glVertex2i(100,100);
glVertex2i(50,100);
glEnd();
glColor3f(1.0,0.0,1.0);
glBegin(GL_LINES);
glVertex2i(x0,y0);
glVertex2i(x1,y1);
glEnd();
glPopMatrix();
glFlush();
}
}
void display()
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2i(50,50);
glVertex2i(100,50);
glVertex2i(100,100);
glVertex2i(50,100);
glEnd();
glColor3f(1.0,0.0,1.0);
glBegin(GL_LINES);
glVertex2i(60,20);
glVertex2i(80,120);
glVertex2i(80,20);
glVertex2i(60,120);
glEnd();
LineClip(60,20,80,120);
LineClip(80,20,60,120);
glFlush();
}
void init()
{
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,300,0,300);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(0,0);
glutInitWindowSize(500,500);
glutCreateWindow("Cohen Sutherland line and drawing algorithm");
init();
glutDisplayFunc(display);
glutMainLoop();
}
#include<stdio.h>
#include<GL/glut.h>
#define true 1;
#define false 0;
#define bool int;
double x,y;
int xmin=50,xmax=100,ymin=50,ymax=100;
const int RIGHT=8,LEFT=2,TOP=4,BOTTOM=1;
int outcode0,outcode1,outcodeout,done,accept;
int computeoutcode(double x,double y)
{
int code=0;
if(y>ymax)
code|=TOP;
else if(y<ymin)
code|=BOTTOM;
if(x>xmax)
code|=RIGHT;
else if(x<xmin)
code|=LEFT;
return code;
}
void LineClip(double x0,double y0,double x1,double y1)
{
int accept=false;
int done=false;
outcode0=computeoutcode(x0,y0);
outcode1=computeoutcode(x1,y1);
do{
if(!(outcode0|outcode1))
{
accept=true;
done=true;
}
else if(outcode0&outcode1)
{
done=true;
}
else
{
outcodeout=outcode0?outcode0:outcode1;
if(outcodeout & TOP)
{
x=x0+(x1-x0)*(ymax-y0)/(y1-y0);
y=ymax;
}
else if(outcodeout & BOTTOM)
{
x=x0+(x1-x0)*(ymin-y0)/(y1-y0);
y=ymin;
}
else if(outcodeout & RIGHT)
{
y=y0+(y1-y0)*(xmax-x0)/(x1-x0);
x=xmax;
}
else
{
y=y0+(y1-y0)*(xmin-x0)/(x1-x0);
x=xmin;
}
if(outcodeout==outcode0)
{
x0=x;y0=y;outcode0=computeoutcode(x0,y0);
}
else
{
x1=x;y1=y;outcode1=computeoutcode(x1,y1);
}
}
}while(!done);
if(accept)
{
glPushMatrix();
glTranslatef(100,100,0);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2i(50,50);
glVertex2i(100,50);
glVertex2i(100,100);
glVertex2i(50,100);
glEnd();
glColor3f(1.0,0.0,1.0);
glBegin(GL_LINES);
glVertex2i(x0,y0);
glVertex2i(x1,y1);
glEnd();
glPopMatrix();
glFlush();
}
}
void display()
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2i(50,50);
glVertex2i(100,50);
glVertex2i(100,100);
glVertex2i(50,100);
glEnd();
glColor3f(1.0,0.0,1.0);
glBegin(GL_LINES);
glVertex2i(60,20);
glVertex2i(80,120);
glVertex2i(80,20);
glVertex2i(60,120);
glEnd();
LineClip(60,20,80,120);
LineClip(80,20,60,120);
glFlush();
}
void init()
{
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,300,0,300);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(0,0);
glutInitWindowSize(500,500);
glutCreateWindow("Cohen Sutherland line and drawing algorithm");
init();
glutDisplayFunc(display);
glutMainLoop();
}
OUTPUT :
( click on image to zoom )
No comments:
Post a Comment