#include <graphics.h>
#include <conio.h>
int xw_min,xw_max,yw_min, yw_max;
main()
{
int driver,mode;
int x1,y1,x2,y2;
xw_min=150; yw_min=100;xw_max=500; yw_max=300;
driver=DETECT;
initgraph(&driver,&mode,"");
draw_win(1);
x1=60;y1=120;x2=580;y2=270;
clipline(x1,y1,x2,y2);
x1=480;y1=260;x2=700;y2=150;
clipline(x1,y1,x2,y2);
getch();
closegraph();
}
clipline(int x1,int y1,int x2,int y2)
{
int i,code1[4],code2[2],done,display;
float m;
int x11,x22,y11,y22,mark;
done=0;
display=0;
while(done==0)
{
x11=x1;x22=x2;y11=y1;y22=y2;
setcolor(2);
line(x1,y1,x2,y2);
encode(x1,y1,code1);
encode(x2,y2,code2);
if(accept(code1,code2))
{
done=1;
display=1;
break;
}
else if(reject(code1,code2))
{
done=1;
break;
}
mark=swapyn(code1,code2);
if(mark==1)
{
x1=x22;
x2=x11;
y1=y22;
y2=y11;
}
if(x2==x1) m=-1;
else m=(float)(y2-y1)/(float)(x2-x1);
if(code1[0])
{
x1+=(yw_min-y1)/m;
y1=yw_min;
}
else if(code1[1])
{
x1-=(y1-yw_max)/m;
y1=yw_max;
}
else if(code1[2])
{
y1-=(x1-xw_min)*m;
x1=xw_min;
}
else if(code1[3])
{
y1+=(xw_max-x1)*m;
x1=xw_max;
}
}
if(display==1)
setcolor(3);
line(x1,y1,x2,y2);
}
encode(int x,int y,int code[])
{
int i;
for(i=0;i<4;i++) code[i]=0;
if(x<xw_min)
code[2]=1;
else if(x>xw_max)
code[3]=1;
if(y>yw_max)
code[1]=1;
else if(y<yw_min)
code[0]=1;
}
accept(int code1[],int code2[])
{
int i,flag;
flag=1;
for(i=0;i<4;i++)
if((code1[i]==1)||(code2[i]==1))
{
flag=0;
break;
}
return(flag);
}
reject(int code1[],int code2[])
{
int i,flag;
flag=0;
for(i=0;i<4;i++)
if((code1[i]==1)&&(code2[i]==1))
{
flag=1;
break;
}
return(flag);
}
swapyn(int code1[],int code2[])
{
int i,flag1,flag2,tmp;
flag1=1;
for(i=0;i<4;i++)
if(code1[i]==1)
{
flag1=0;
break;
}
flag2=1;
for(i=0;i<4;i++)
if(code2[i]==1)
{
flag2=0;
break;
}
if((flag1==0)&&(flag2==0)) return(0);
if((flag1==1)&&(flag2==0))
{
for(i=0;i<4;i++)
{
tmp=code1[i];
code1[i]=code2[i];
code2[i]=tmp;
}
return(1);
}
return(0);
}
draw_win(int c)
{
setcolor(c);
line(xw_min,yw_min,xw_max,yw_min);
line(xw_max,yw_min,xw_max,yw_max);
line(xw_max,yw_max,xw_min,yw_max);
line(xw_min,yw_max,xw_min,yw_min);
}