You are on page 1of 8

Source Code of Sutherland-Hodgeman Polygon Clipping Algorithm in C

#include<graphics.h>
#include<stdio.h>
void check(float,float,float,float,int);
void display();

int cx1,cx2,cy1,cy2,i;
float x[50],y[50],xt[50],yt[50];
int nt=0,k=0,g,h,n;

void main(){
int p,j;
int gd=DETECT,gm;
initgraph(&gd,&gm,"..\\BGI");
printf("this is coded by Dipesh \n");

/**
* GETTING CO ORDINATES OF CLIPPING WINDOW
*/
printf(" Enter the co ordinate of the top left corner of the clipping window: ");
scanf("%d%d",&cx1,&cy1);
printf(" Enter the co ordinate of the bottom right corner of the clipping window: ");
scanf("%d%d",&cx2,&cy2);

/**
* GETTING NUMBER OF VERTICES OF POLYGON
*/
printf(" Enter value of n: ");
scanf("%d",&n);
/**
* GETTING VERTICES OF POLYGON
*/
for(p=0;p<n;p++){
printf(" Enter x%d,y%d: ",p+1,p+1);
scanf("%f%f",&x[p],&y[p]);
}

g=x[n-1];
h=y[n-1];

setcolor(5);
clearviewport();
rectangle(cx1,cy1,cx2,cy2); //SHOW CLIPPING WINDOW
getch();
display(); //SHOW POLYGON

/**
* CLIP THE POLYGON
*/
for(j=1;j<=4;j++){
k=0;
i=0;
for(i=0;i<n-1;){
check(x[i],y[i],x[i+1],y[i+1],j);
i++;
}
check(x[i],y[i],x[0],y[0],j);
n=k;
for(p=0;p<nt;p++){
x[p]=xt[p];
y[p]=yt[p];
}
}

clearviewport();
setcolor(5);
rectangle(cx1,cy1,cx2,cy2); //SHOW CLIPPING WINDOW
setcolor(3);
display(); //SHOW RESULTING POLYGON
}

void check(float x1,float y1,float x2,float y2,int side){


float m;
if(x1!=x2)
m=(y2-y1)/(x2-x1);

/**
* CHECK WHETHER THE POINT IS INSIDE OR OUTSIDE.
* IF THE FIRST POINT IS INSIDE AND SECOND POINT IS OUTSIDE,
* FIND THE INTERCEPTION POINT AND ADD IT TO THE RESULTANT
* VERTEX SET.
* IF THE FIRST POINT IS OUTSIDE AND SECOND POINT IS INSIDE,
* ADD SECOND POINT TO THE RESULTANT VERTEX SET.
* IF BOTH POINTS ARE INSIDE, ADD SECOND POINT TO THE RESULTANT
* VERTEX SET.
* IF BOTH POINTS ARE OUTSIDE, THEN DISCARD BOTH POINTS.
*
* ALSO DO THE SAME OPERATIONS FOR X AND Y CO ORDINATES
*/
switch(side){
case 1:
if(x1<cx1&&x2>cx1){
xt[k]=cx1;
yt[k]=m*(cx1-x1)+y1;
k++;
xt[k]=x2;
yt[k]=y2;
k++;
}else if(x1>=cx1&&x2>=cx1){
xt[k]=x2;
yt[k]=y2;
k++;
}else if(x1>cx1&&x2<cx1){
xt[k]=cx1;
yt[k]=m*(cx1-x1)+y1;
k++;
}
break;
case 2:
if(x1>cx2&&x2<cx2){
xt[k]=cx2;
yt[k]=m*(cx2-x1)+y1;
k++;
xt[k]=x2;
yt[k]=y2;
k++;
}else if(x1<cx2&&x2>cx2){
xt[k]=cx2;
yt[k]=m*(cx2-x1)+y1;
k++;
}else if(x1<=cx2&&x2<=cx2){
xt[k]=x2;
yt[k]=y2;k++;
}
break;
case 3:
if(y1>cy2&&y2<cy2){
yt[k]=cy2;
if(x1==x2)
xt[k]=x1;
else
xt[k]=(cy2-y2)/m+x2;
k++;
xt[k]=x2;
yt[k]=y2;
k++;
}else if(y1<=cy2&&y2<=cy2){
xt[k]=x2;
yt[k]=y2;
k++;
}else if(y1<cy2&&y2>cy2){
yt[k]=cy2;
if(x1==x2)
xt[k]=x1;
else
xt[k]=(cy2-y2)/m+x2;
k++;
}
break;
case 4:
if(y1<cy1&&y2>cy1){
yt[k]=cy1;
if(x1==x2)
xt[k]=x1;
else
xt[k]=(cy1-y1)/m+x1;
k++;
xt[k]=x2;
yt[k]=y2;
k++;
}else if(y1>cy1&&y2<cy1){
yt[k]=cy1;
if(x1==x2)
xt[k]=x1;
else
xt[k]=(cy1-y2)/m+x2;
k++;
}else if(y1>=cy1&&y2>=cy1){
yt[k]=y2;
xt[k]=x2;
k++;
}
break;
}
nt=k;
}

/**
* DRAW THE POLYGON
*/
void display(){
int i;
for(i=0;i<n-1;i++)
line(x[i],y[i],x[i+1],y[i+1]); //DRAW EDGES 1 TO N-1
line(x[i],y[i],x[0],y[0]); //DRAW EDGE N
getch();
}

Output:-
Result:- Thus, Sutherland-Hodgeman Polygon Clipping Algorithm in C was implemented.

You might also like