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