#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;
}
中点分割裁剪算法
最新推荐文章于 2023-01-02 16:59:41 发布