Computer Graphics in C,C++

Tuesday, 6 January 2009

Clip a line by using Cohen- Sutherland Algorithm

#include"stdio.h"
#include"graphics.h"
enum { TOP=0x1, BOTTOM=0x2, RIGHT=0x4, LEFT=0x8 };
void lineclip(float x1,float y1,float x2,float y2,float xwmin,float ywmin,float xwmax,float ywmax );
int calcode (float x,float y,float xwmin,float ywmin,float xwmax,float ywmax);
main()
{

float x2,y2,x1,y1,xwmin,ywmin,xwmax,ywmax;
int gd=DETECT,gm;
initgraph(&gd,&gm," ");
printf("\n\n\tEnter the co-ordinates of Line :");
printf("\n\n\tX1 Y1 : ");
scanf("%f %f",&x1,&y1);
printf("\n\n\tX2 Y2 : ");
scanf("%f %f",&x2,&y2);
printf("\n\tEnter the co_ordinates of window :\n ");
printf("\n\txwmin , ywmin : ");
scanf("%f %f",&xwmin,&ywmin);
printf("\n\txwmax , ywmax : ");
scanf("%f %f",&xwmax,&ywmax);
clearviewport();
line(x1,y1,x2,y2);
rectangle(xwmin,ywmin,xwmax,ywmax);
getch();
cleardevice();
lineclip(x1,y1,x2,y2,xwmin,ywmin,xwmax,ywmax );
getch();

}

void lineclip(float x1,float y1,float x2,float y2,float xwmin,float ywmin,float xwmax,float ywmax )
{
int code0,code1,codeout;
int accept = 0, done=0;

code0 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
code1 = calcode(x2,y2,xwmin,ywmin,xwmax,ywmax);

do{
if(!(code0 | code1))
{ accept =1 ; done =1; }
else
if(code0 & code1) { done = 1;}
else
{
float x,y;
if(code0)
codeout=code0;
else codeout=code1;
//codeout = code0 ? code0 : code1;
if(codeout & TOP)
{
x = x1 + (x2-x1)*(ywmax-y1)/(y2-y1);
y = ywmax;
}
else
if( codeout & BOTTOM)
{
x = x1 + (x2-x1)*(ywmin-y1)/(y2-y1);
y = ywmin;
}
else
if ( codeout & RIGHT)
{
y = y1+(y2-y1)*(xwmax-x1)/(x2-x1);
x = xwmax;
}
else
{
y = y1 + (y2-y1)*(xwmin-x1)/(x2-x1);
x = xwmin;
}
if( codeout == code0)
{
x1 = x; y1 = y;
code0=calcode(x1,y1,xwmin,ywmin,xwmax,ywmax);
}
else
{
x2 = x; y2 = y;
code1 = calcode(x2,y2,xwmin,ywmin,xwmax,ywmax);
}
}
} while( done == 0);

if(accept) line(x1,y1,x2,y2);

rectangle(xwmin,ywmin,xwmax,ywmax);

getch();

}


int calcode (float x,float y,float xwmin,float ywmin,float xwmax,float ywmax)
{
int code =0;

if(y> ywmax)
code =TOP;
else if( y code = BOTTOM;
else if(x > xwmax)
code = RIGHT;
else if ( x< xwmin)
code = LEFT;

return(code);
}

No comments:

Post a Comment