现在的位置: 首页 > 综合 > 正文

中点分割裁剪算法

2014年02月18日 ⁄ 综合 ⁄ 共 1048字 ⁄ 字号 评论关闭
#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;
}

抱歉!评论已关闭.