کد:
#define true 1
#define false 0
enum B {Left=0,Right=1,Top=3,Buttom=2};
typedef int code[4];
typedef struct pt{
double x,y;
}
void encode(point Wmin,poin Wmax,point pt,code c) {
int i;
for(i=Left;i<=Top;i++)
c[i]=false;
if(pt.x<Wmin.x) c[Left]=true;
if(pt.x<Wmax.x) c[Right]=true;
if(pt.x<Wmin.y) c[Buttom]=true;
if(pt.x<Wmax.y) c[Top]=true;
}
int accept(code c1,code c2)
{
int k;
for(k=Left;k<=Top,k++)
if(c1[k] || c2[k])
return False;
return true;
}
int reject(code c1,code c2)
{
int k;
for(k=Left;k<=Top;k++)
if(c1[k]&&c2[k])
return true;
return false;
}
int ptinside(code c)
{
return ! (c[Left] || c[Right] || c[Buttom] || c[Top]);
}
void swappt(point*p1,point*p2)
{
point temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
void swapcode(code c1,code c2);
{
int i,temp;
for(i=Left;i<=Top;i++)
{
temp=c1[i];
c1[i]=c2[i];
c2[i]=temp;
}
}
void clipsuth(point wmin,point wmax,point *p1,point *p2)
{
code code1,code2;
int done=false;
int draw=false;
double m;
while(!done)
{
encode(Wmin,Wmax,*p1,code1);
encode(Wmin,Wmax,*p2,code2);
if(accept(code1,code2))
done=draw=true;
elseif(reject(code1,code2))
done=true;
else
{
if(ptinside(code1))
{
swappt(p1,p2);
swapcode(code1,code2);
}
m=(p2->y-p1->y)/((double)(p2->x-p1->x));
if(code1)
}
p1->y+=(Wmin.x-p1->x)*m;
p1->x=Wmin.x;
}
elseif(code1[Right])
{
p1->y+=(Wmax.x-p1->x)*m;
p1->x=Wmax.x;
}
elseif(code1[Buttom])
{
p1->x+=(Wmin.y-p1->y)/m;
p1->y=Wmin.y;
}
elseif(code1[Top])
{
p1->x+=(Wmax.y-p1->y)/m;
p1->y=Wmax.y;
}
}
}
if(draw)
line(floor(p1->x),floor(p1->y),floor(p2->x),floor(p2->y));
}