Friday, December 4, 2009

Sutherland Cohen Line Clipping

#include
#include
#include
#include
#define round(a)((int)(a+0.5))
int xmin=50,ymin=50,xmax=300,ymax=300;
void dda(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()
{ dda(xmin,ymin,xmax,ymin,2);
delay(2);
dda(xmax,ymin,xmax,ymax,2);
delay(2);
dda(xmax,ymax,xmin,ymax,2);
delay(2);
dda(xmin,ymax,xmin,ymin,2);
}
void clip(int xa,int ya,int xb,int yb)
{ int a[4],b[4],c[4],i;
int x1,x2,y1,y2,dy=yb-ya,dx=xb-xa;

float m=(float)(dy/dx),c1=(float)(m*xa-ya);
printf("\n %d %d %d %d",dx,dy,m,c);
if(xa==xb)
{ if(xaxmax||(ya>ymax&&yb>ymax)||(ya { printf("\outside the window");
cleardevice();
drawin();
}
else
{ if(ya>ymax)
ya=ymax;
if(yb>ymax)
yb=ymax;
if(ya ya=ymin;
if(yb yb=ymin;
}
dda(xa,ya,xb,yb,8);
drawin();
}
//*****************************
else
{


for(i=0;i<4;i++)
{ a[i]=b[i]=c[i]=0;}
if(xa if(xa>xmax) a[2]=1;
if(ya if(ya>ymax) a[0]=1;
if(xb if(xb>xmax) b[2]=1;
if(yb if(yb>ymax) b[0]=1;

for(i=0;i<4;i++)
{ c[i]=a[i]&&b[i];

}
if(c[0]==0 && c[1]==0 && c[2]==0 && c[3]==0)
{ if(a[0]==0 && a[1]==0 && a[2]==0 && a[3]==0 &&
b[0]==0 && b[1]==0 && b[2]==0 && b[3]==0)
{ printf("\n the line is totally visible");
dda(xa,ya,xb,yb,WHITE);
drawin();
}
else
{ printf("\n line is partially visible");


printf("\n %d %d ",m,c);
if(a[3]==1&&a[2]==0)
{
x1=xmin;y1=(int)(m*xmin+c1);
printf("\n %d %d ",x1,y1);
}
else if(b[3]==1&&b[2]==0)
{
x2=xmin;y2=(int)(m*xmin+c1);
}
if(a[3]==0&&a[2]==1)
{
x1=xmax;y1=(int)(m*xmax+c1);
}
else if(b[3]==0&&b[2]==1)
{
x2=xmax;y2=(int)(m*xmax+c1);
}
if(a[1]==1 && a[0]==0)
{ x1=(int)(ymin-c1)/m;
y1=ymin;
}
if(b[1]==1 && b[0]==0)
{ x2=(int)(ymin-c1)/m;
y2=ymin;
}
if(a[1]==0 && a[0]==1)
{ x1=(int)(ymax-c1)/m;
y1=ymax;
}
if(b[1]==0 && b[0]==1)
{ x2=(int)(ymax-c1)/m;
y2=ymax;
}

printf("\n %d %d %d %d ", x1,y1,x2,y2);
dda(x1,y1,x2,y2,WHITE);
drawin();
}//end of else
}//end of if
else
{printf("\n the line is invisible");
drawin();
}
}//end of else
}//end of fun
void main()
{int gd,gm;

detectgraph(&gd,&gm);
int xa,ya,xb,yb;
initgraph(&gd,&gm,"..\\bgi");
printf("\n enter starting x n y cordinates for line");
scanf("%d",&xa);
scanf("%d",&ya);
printf("\n enter ending x n y cordinates for line");
scanf("%d",&xb); scanf("%d",&yb);
/* printf("\n enter xmin n ymin cordinates for line");//use it if u
//want to define yr own dimentions for window
scanf("%d",&xmin); scanf("%d",&ymin);
printf("\n enter xmax n ymax cordinates for line");
scanf("%d",&xmax);
scanf("%d",&ymax);*/
drawin();
dda(xa,ya,xb,yb,WHITE);
printf("\n press enter to clip");
getch();
cleardevice();
clip(xa,ya,xb,yb);
getch();
}


No comments:

Post a Comment