裁剪算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(x
if(y
*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;
}