图形学_直线裁剪__实验报告

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

实验报告

实验报告

实验报告三

一、实验目的

1、理解、巩固线段裁剪的含义;

2、掌握Cohen-Sutherland线段裁剪方法。

二、算法原理介绍

对于每条线段P1P2,分为三种情况处理。

(1)若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之。

(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。

(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。

其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。

三、程序源代码

#include

#include

#define LEFT 1

#define RIGHT 2

#define BOTTOM 4

#define TOP 8

#define XL 100

#define XR 300

#define YB 100

#define YT 300

void encode(float x,float y,int * code)

{

int c=0;

if(x

else if (x>XR)c=c | RIGHT;

if(y

else if(y>YT)c=c | TOP;

*code=c;

return;

}

/*(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()

{

int graphdriver=VGA;

int graphmode=VGAHI;

initgraph(&graphdriver,&graphmode,"C:\\TC3.0\\BGI");

rectangle(XL,YB,XR,YT);

C_S_LineCLip(20,30,400,430);

getch();

closegraph();

return;

}

四、实验结果

五、总结与体会

通过此次实验,我学会了Cohen-SutherLand裁剪算法的原理。了解了如何快速的判断一条线段与窗口属何种关系,采用延长窗口的边,把未经裁剪的图形区域分为九个区,然后每个区用四位代码表示,从左到右各位依次表示上下左右。

六、参考文献

孙家广等.计算机图形学.第三版.清华大学出版社,1989.9

相关文档
最新文档