Friday, December 4, 2009

Sutherland Hodgeman Polygon Clipping

#include
#include
#include
#include
#include
#define round(a)((int)(a+0.5))
int xmin=50,ymin=50,xmax=300,ymax=300,x[20],y[20];
void ddaline(int x1,int y1,int x2,int y2,int col)
{ int dx,dy,steps,k;
float x,y,xinc,yinc;
dx=x2-x1;
dy=y2-y1;
if(abs(dx)>abs(dy))
steps=abs(dx);
else
steps=abs(dy);
xinc=(float) dx/steps;
yinc=(float) dy/steps;
x=x1;y=y1;
for(k=0;k { putpixel(round(x),round(y),col);
x+=xinc;
y+=yinc;
}
}
void drawin()
{ ddaline(xmin,ymin,xmax,ymin,5);
delay(2);
ddaline(xmax,ymin,xmax,ymax,5);
delay(2);
ddaline(xmax,ymax,xmin,ymax,5);
delay(2);
ddaline(xmin,ymax,xmin,ymin,5);
}
int clip(int n,int d,int col)
{
int u[20],v[20],i=0,j=0;
float m,c;
for(i=0;i { if(d==1)
{ //printf("\n left clip");
if(x[i] else if(x[i]>=xmin && x[i+1]>=xmin)
{ u[j]=x[i];v[j++]=y[i];
}
else
{ m=(float)(y[i+1]-y[i])/(x[i+1]-x[i]);
c=(float)(y[i]-m*x[i]);
if(x[i]>xmin)
{ u[j]=x[i];
v[j++]=y[i];
}
u[j]=xmin;
v[j++]=(int)(m*xmin+c);

}//end of else
}//end of if
//^^^^^^^^^^^^^^^
if(d==2)
{//printf("\n right clip");
if(x[i]>xmax && x[i+1]>xmax);
else if(x[i]<=xmax && x[i+1]<=xmax)
{ u[j]=x[i];v[j++]=y[i];
}
else
{ m=(float)(y[i+1]-y[i])/(x[i+1]-x[i]);
c=(float)(y[i]-m*x[i]);
if(x[i] { u[j]=x[i];
v[j++]=y[i];
}
u[j]=xmax;
v[j++]=(int)(m*xmax+c);

}//end of else
}//end of if
//********************
if(d==3)
{ //printf("\n bottom clip");
if(y[i]>ymax&&y[i+1]>ymax);
else if(y[i]<=ymax && y[i+1]<=ymax)
{ u[j]=x[i];
v[j++]=y[i];
}
else
{ if(x[i]==x[i+1])
{ if(y[i]<=ymax)
{ u[j]=x[i];
v[j++]=y[i];
}
u[j]=x[i];
v[j++]=ymax;
}
else
{
m=(float)(y[i+1]-y[i])/(x[i+1]-x[i]);
c=(float)(y[i]-m*x[i]);
if(y[i]<=ymax)
{u[j]=x[i];v[j++]=y[i];
}
u[j]=(int)(ymax-c)/m;
v[j++]=ymax;
}
} //end of else
}//end of if
//*******************************
if(d==4)
{ //printf("\n top clip");
if(y[i] else if(y[i]>=ymin && y[i+1]>=ymin)
{ u[j]=x[i];
v[j++]=y[i];
}
else
{ if(x[i]==x[i+1])
{ if(y[i]>=ymin)
{ u[j]=x[i];
v[j++]=y[i];
}
u[j]=x[i];
v[j++]=ymin;
}
else
{
m=(float)(y[i+1]-y[i])/(x[i+1]-x[i]);
c=(float)(y[i]-m*x[i]);
if(y[i]>=ymin)
{u[j]=x[i];v[j++]=y[i];
}
u[j]=(int)(ymin-c)/m;
v[j++]=ymin;
}
} //end of else
}//end of if
}//end of for
//*******************************
drawin();
for(i=0;i { x[i]=u[i];
y[i]=v[i];
}
x[j]=x[0];
y[j]=y[0];

for(i=0;i {
ddaline(x[i],y[i],x[i+1],y[i+1],col);
}
getch();
return(j);
}

// **************************
void main()
{ int gd,gm;
detectgraph(&gd,&gm);
int n,q,r,s,t,i;
initgraph(&gd,&gm,"..\\bgi");
printf("\n enter the no of sides of polygon\n");
scanf("%d",&n);
printf("\n enter the end points of polygon\n");
for(i=0;i {
scanf("%d",&x[i]);
scanf("%d",&y[i]);
}
x[i]=x[0];y[i]=y[0];
for(i=0;i {
ddaline(x[i],y[i],x[i+1],y[i+1],WHITE);
}
drawin();
printf("\n press enter to clip");
getch();cleardevice();
printf("\n left clip");
q=clip(n,1,1);getch();
printf("\n right clip");
r=clip(q,2,2);getch();
printf("\n bottom clip");
s=clip(r,3,3);getch() ;
printf("\n top clip");
t=clip(s,4,4);cleardevice();getch();

for(i=0;i {
ddaline(x[i],y[i],x[i+1],y[i+1],WHITE);
}
drawin();
getch();
}

No comments:

Post a Comment