#define LEFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 #define XL 150 #define XR 350 #define YB 150 #define YT 300 #include <math.h> #include <stdio.h> #include <graphics.h> main() { int x1,y1,x2,y2,xx,yy,xxx,yyy; int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode," "); setcolor(12); line(XL,YT,XR,YT); line(XL,YB,XR,YB); line(XL,YT,XL,YB); line(XR,YT,XR,YB); x1=50;y1=200;x2=400;y2=300; setcolor(1); line(x1,y1,x2,y2); xx=0;yy=0;xxx=0;yyy=0; draw_ett(x1,y1,x2,y2,&xx,&yy); draw_ett(x2,y2,xx,yy,&xxx,&yyy); setcolor(14); line(xx,yy,xxx,yyy); getch(); closegraph(); } int encode (int x, int y, int *code) { int c=0; if (x<XL) c=c|LEFT; else if (x>XR) c=c|RIGHT; if (y<YB) c=c|BOTTOM; else if (y>YT) c=c|TOP; *code=c; return code; } draw_ett(int x1, int y1, int x2, int y2, int *x, int *y) { int code1,code2,code; int xx,yy; float d,d1,d2; encode(x1,y1,&code1); encode(x2,y2,&code2); if (code2==0) { xx=x2; yy=y2; *x=xx; * y=yy; return;} if ((code1&code2)!=0) return; L1: xx=(x1+x2)/2; yy=(y1+y2)/2; encode(xx, yy, &code); d1=(yy-y1)*(yy-y1); d2=(xx-x1)*(xx-x1); d=sqrt(d1+d2); if (d<=1) { *x=xx;*y=yy; return;} if ((code&code1)!=0) { x1=xx; y1=yy; } else { x2=xx; y2=yy;} goto L1; }