- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 裁剪( Clipping) 裁剪:确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形。这个选择过程称为裁剪。 在使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图的一部分。 3.1 线段裁剪 线段裁剪算法是复杂图元裁剪的基础。复杂的曲线可以通过折线段来近似,从而裁剪问题也可以化为线段的裁剪问题。 所谓线段裁剪就是把线段位于裁剪区域的部分找出来,而把位于裁剪区域之外的部分去掉。 最常见的裁剪区域是长方形。 线段裁剪的基本思想 判断线段与窗口的位置关系: 1.确定直线是完全可见; 2.部分可见; 3.还是完全不可见。 对部分可见线段,求出它与窗口边界的交点,并将窗口内的线段输出。 2 区域编码 Cohen-Sutherland算法针对水平长方形区域(Upright rectangle)。 长方形的四条边所在的四条直线把整个平面区域分成9个部分。 我们用四个二进制位来描述9个区域进行编码.目的是能快速地确定线段所在区域。 第1位:1,位于窗口的左边;0,其它 第2位:1,位于窗口的右边;0,其它 第3位:1,位于窗口的下方;0,其它 第4位:1,位于窗口的上方;0,其它 长方形划分的9个区域有如下编码: 3 区域测试 对于一条直线段, 设其两端点的上述编码为 和 。 那么: (i) 时线段位于长方形区域内; (ii) 和 的位与不为0,则线段位于窗口外。 (iii)其它情形需要进一步测试。 可以通过端点区域码直接测试的例子: 不能直接测试的例子: 4 线段求交 对于不能马上判定位于窗口外还是窗口内的线段,需要进行求交(裁剪)。 具体实现时,可按编码顺序(即左、右、下、上)对窗口的边界逐个次测试,如与线段相交则裁剪。 例 (i)线段位于左边界的两边(两端点的第1位不同),求出交点,并把左边的线段去掉。 例 (ii)线段位于右边界的两边(两端点的第2位不同),求出交点,并把右边的线段去掉。 例 (iii)线段位于下边界的两边(两端点的第3位不同),求出交点,并把下边的线段去掉。 例 (iv)线段位于左边界的两边(两端点的第1位不同),求出交点,并把上边的线段去掉。 5 求交 由于窗口边界与坐标轴平行,求交比较简单。 以左边界为例, 其边界的方程为 而线段的方程为: 因此交点为: 6 算法步骤 (i) 对两个端点进行编码; (ii) 如果两个代码的位“或”为0说明线段位于窗口内,保存线段,结束; (iii) 如果两个代码的位“与”不为0说明线段位于窗口某边界的外侧,结束; (iv) 逐个边界进行求交测试,如果位于该边界的两侧则求交并回到(i);否则再取下一条边进行求交测试。 (v) 如果有线段位于窗口内则画出直线段。 编码: Code(int x,int y,int *c) { *c=0; /*(xmin,ymin)和(xmax,ymax)为窗口左下角、右上角坐标。*/ if(yymax) *c=*c|0x08; else if(yymin) *c=*c|0x04; if(xxmax) *c=*c|0x02; else if(xxmin) *c=*c|0x01;} 求交: 计算线段P1(x1,y1)P2(x2,y2)与窗口边界的交点 if(LEFTcode !=0) { x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1);} else if(RIGHTcode !=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1);} else if(BOTTOMcode !=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);} 7 讨论 (i)Cohen-Sutherland算法有时要进行多次(最多4次)求交才能求出位于窗口内的线段,也可能没有。 (ii)算法不能处理窗口为任意
文档评论(0)