裁剪算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

///////////////////////////////////////////////////
// 程序名称:裁剪算法,n=5的金刚石
// 编译环境:Visual Studio 2010,EasyX 2013冬至版
// 作 者:吴一丹
// 最后修改:2015-10-15
//
#include
#include

#include
using namespace std;
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8

#define XL 100
#define XR 300
#define YB 100
#define YT 300

int encode(float x,float y,int * code)
{
int c=0;
if(xelse if (x>XR)c=c | RIGHT;
if(yelse if(y>YT)c=c | TOP;
*code=c;
return 0;
}

//(x1,y1)与(x2,y2)是线段端点坐标,其它四个参数分别定义窗口的左,下,右,上边界


void C_S_LineCLip(float x1, float y1, float x2, float y2)

{
int code1,code2,code;
float x,y;
encode(x1,y1,&code1);
encode(x2,y2,&code2);

while((code1!=0) || (code2!=0))

{
if((code1&code2)!=0)return;
code=code1;

if(code1==0)
code=code2;

if((LEFT&code)!=0)//线段与左边界相交
{
x=XL;
y=y1+(y2-y1)*(XL-x1)/(x2-x1);
}

else if((RIGHT&code)!=0)//线段与右边界相交
{
x=XR;
y= y1+(y2-y1)*(XR-x1)/(x2-x1);
}

else if((BOTTOM&code)!=0)//线段与下边界相交
{
y=YB;
x=x1+(x2-x1)*(YB-y1)/(y2-y1);
}

else if((TOP&code)!=0) //线段与上边界相交
{
y=YT;
x=x1+(x2-x1)*(YT-y1)/(y2-y1);
}

if(code==code1)
{x1=x;y1=y;encode(x,y,&code1);}
else
{x2=x;y2=y;encode(x,y,&code2);}
}

line((int)x1,(int)y1,(int)x2,(int)y2);

return;

}

void main()
{
initgraph(480,640);
rectangle(XL,YB,XR,YT);
C_S_LineCLip(20,30,400,430);
getch();
closegraph();
return;

}

相关文档
最新文档