Wednesday, November 17, 2010

Program for line clipping usingCohen-Sutherland algorithm




//Program for line clipping usingCohen-Sutherland algorithm

#include
#include
#include
#define LEFT_EDGE 0x1
#define RIGHT_EDGE 0x2
#define BOTTOM_EDGE 0x4
#define TOP_EDGE 0x8
#define INSIDE(a) (!a)
#define REJECT(a,b) (a&b)
#define ACCEPT(a,b) (!(a|b))
#define FALSE 0
#define TRUE 1
#define ROUND(a) (int) (a+0.5)
typedef struct wcPt2{
float x,y;
};
typedef struct dcPt{
float x,y;
};

void swapPts(wcPt2*p1,wcPt2*p2)
{
wcPt2 tmp;
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
unsigned char encode(wcPt2 pt, dcPt winMin,dcPt winMax)
{
unsigned char code=0x00;
if(pt.x
code=code|LEFT_EDGE;
if(pt.x>winMax.x)
code=code|RIGHT_EDGE;
if(pt.y
code=code|BOTTOM_EDGE;
if(pt.y>winMax.y)
code=code|TOP_EDGE;
return (code);
}


void swapCodes(unsigned char*c1,unsigned char*c2)
{
unsigned char tmp;
tmp=*c1;
*c1=*c2;
*c2=tmp;
}

void clipLine(dcPt winMin,dcPt winMax,wcPt2 p1,wcPt2 p2)
{
unsigned char code1,code2;
int done=FALSE, draw=FALSE;
float m;
while(!done)
{
code1=encode(p1,winMin,winMax);
code2=encode(p2,winMin,winMax);
if(ACCEPT(code1,code2))
{
done=TRUE;
draw=TRUE;
}

else if(REJECT(code1,code2))
done=TRUE;

else
{
if(INSIDE(code1))
{
swapPts(&p1,&p2);
swapCodes(&code1,&code2);
}
if(p2.x!=p1.x)
m=(p2.y-p1.y)/(p2.x-p1.x);
if(code1&LEFT_EDGE)
{
p1.y+=(winMin.x-p1.x)*m;
p1.x=winMin.x;
}
else if(code1&RIGHT_EDGE)
{
p1.y+=(winMax.x-p1.x)*m;
p1.x=winMax.x;
}
else if(code1&BOTTOM_EDGE)
{
if(p2.x!=p1.x)
p1.x+=(winMin.y-p1.y)/m;
p1.y=winMin.y;
}
else if(code1&TOP_EDGE)
{
if(p2.x!=p1.x)
p1.x+=(winMax.y-p1.y)/m;
p1.y=winMax.y;
}
}
}
cleardevice();
outtextxy(280,10,"AFTER CLIPPING");
rectangle(winMin.x,winMin.y,winMax.x,winMax.y);
line(ROUND(p1.x),ROUND(p1.y),ROUND(p2.x),ROUND(p2.y));
getch();
}

void main()
{
int gd=DETECT,gm;
wcPt2 p1,p2;
dcPt winMin,winMax;
printf("\nEnter Left-top corner coordinates of the window : ");
scanf("%f %f",&winMin.x,&winMin.y);
printf("Enter Right-bottom corner coordinates of the window : ");
scanf("%f %f",&winMax.x,&winMax.y);
printf("\nEnter coordinates of the line :-");
printf("\nFirst point : ");
scanf("%f %f",&p1.x,&p1.y);
printf("Second point : ");
scanf("%f %f",&p2.x,&p2.y);
initgraph(&gd,&gm,"e:\\tc\\bgi");
outtextxy(280,10,"BEFORE CLIPPING");
rectangle(winMin.x,winMin.y,winMax.x,winMax.y);
line(p1.x,p1.y,p2.x,p2.y);
getch();
cleardevice();
clipLine(winMin,winMax,p1,p2);
}

No comments:

Post a Comment