资源描述:
《图形学实验报告直线段的裁剪算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验报告Experimentation应portofTaiyuanteachersCollege旅<一、实验目的二、实验原理三、实验仪器及材料四、实验方法五、实验记录及数据处理六、误差分析及讨论系部计算机系姓名年级三年级同组者课程图形学口期项同直线段的裁剪算法一、实验目的:1.熟悉图形裁剪的基木知识2.掌握Cohen-Sutherland直线裁剪算法二、实验内容:在矩形窗口的裁剪算法中,考虑到构成图形的基本元素就是线段,曲线可看成是有很多小线段逼近而成的,因此,讨论线段的裁剪算法更为实用,即Cohen-Sutherland裁剪算法。Cohen-Sutherl
2、and裁剪算法具体思路如下。任意平面线段和矩形窗口的位置关系只会有如下3种:(1)完全落在窗口内。(2)完全落在窗口外。(3)部分落在窗口内,部分落在窗口外。要想判断线段和窗口的位置关系,只要找到线段的两端点相对于矩形窗口的位置即可,线段的两端点相对于矩形窗口的位置可能会有如下几种情况:(1)线段的两个端点均在窗口内,这时线段全部落在窗口内,完全可见,应予以保留。(2)线段的两个端点均在窗口边界线外同侧,这时线段全部落在窗口外,完全不可见,应予以舍弃。(3)线段的一个端点在窗口内,另一个端点在窗口外,这时线段部分可见,应求出线段与窗口边界线的交点,从而得到线
3、段在窗口内的可见部分。(4)线段的两个端点均不在窗口内,但不处于窗口边界线外同侧,这时有可能线段是部分可见的,也可能是完全不可见的。Cohen-Sutherland裁剪算法就是按照上述思路来对线段进行裁剪的,只是在线段的两端点相对于矩形窗口的位置上,巧妙地运用了编码的思想。首先,延长窗口的四条边界线,将平面划分成9个区域,然后,用四位二进制数C3C2C1C0对这9个区域进行编码,编码规则如下:第0位CO:当线段的端点在窗口的左边界之左时,该位编码为1,否则,该位编码为Oo第1位Cl:当线段的端点在窗口的右边界之右吋,该位编码为1,否则,该位编码为0。第2位C
4、2:当线段的端点在窗口的下边界之下时,该位编码为1,否则,该位编码为Oo第3位C3:当线段的端点在窗口的上边界之上时,该位编码为1,否则,该位编码为Oo于是算法步骤可描述如下:步骤1:根据上述编码规则,对线段的两个端点进行编码。步骤2:根据线段的两端点编码判断线段相对于窗口的位置关系,从而决定对线段如何剪取。(1)两端点编码全为0000吋,说明线段完全位于窗口内,是完全可见的,于是显示此线段。(2)两端点编码逐位逻辑与不为0时,说明线段的两个端点位于窗口外同侧,即此线段完全位于窗口外,是完全不可见的,于是全部舍弃,不显示此线段。(3)两端点编码逐位逻辑与为0
5、时,说明此线段或者部分可见,或者完全不可见。此吋需要计算出线段与窗口某一边界线或边界线的延长线的交点,若交点在窗口边界线的延长线上,则说明该线段完全位于窗口外,不予以显示;若交点在窗口边界线上,则对以其中一个交点为分割点的两端线段,再分别对其端点进行编码,并按照上述(1)和(2)所示的方法进行测试,从而舍弃完全位于窗口外的一段线段,保留并显示完全位于窗口内的一段线段。三、实验代码:Cohen-SutherLand实现裁剪直线的两个关键函数//计算点x,y的编码voidCCohenSutherLandView::CompOutCode(floatx,float
6、y,CRect*rcct,OutCode*outCodc){outCode->all二0;outCode->top=outCode-〉bottom=0;if(ytop){outCode->top=1;outCode->all+二1;}elseif(y>rect->bottom)outCode->bottom=1;outCode->all+二1;}outCode~>right二outCodc~>left二0;if(x>rect->right){outCode->right二1;outCode~>all+二1;}elseif(xlef
7、t){outCode->left二1;outCode->all+二1;//Cohen-SutherLand线段裁剪算法voidCCohenSutherLandView::CohenSutherLineClip(CDC*pDC,floatxO,floatyO,floatxl,floatyl,CRect*rect){BOOLaccept,done;OutCodeoutCodeO,outCodel;OutCode*outCodeOut;floatx,y;accept二FALSE;done=FALSE;CompOutCode(xO,yO,rect,feoutCode
8、O);CompOutCode(xl,yl,rect,