第5章_图形变换与观察概要.ppt

  1. 1、本文档共79页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章_图形变换与观察概要

5.1 裁剪 0010 1010 1000 0000 0001 1001 0101 0100 0110 L1 L2 L3 L4 L5 区域编码和位置关系示意图 P1 P2 P3 P4 裁剪一条线段时,先求出两端点所在的区号code1和code2,若code1 = 0且code2 = 0,则说明线段的两个端点均在窗口内,那么整条线段必在窗口内,应取之,如图中的线段L3;若code1和code2经按位与运算的结果不为0,则说明两个端点同在窗口的上方、下方、左方或右方。如图中的线段L1,其两端点的编码与运算的结果code1 code2 = 1000,左起第一位不为0说明两端点均在窗口上方,L1肯定在窗口之外。这种情况下,对线段的处理是弃之。 5.1 裁剪 0010 1010 1000 0000 0001 1001 0101 0100 0110 L1 L2 L3 L4 L5 区域编码和位置关系示意图 P1 P2 P3 P4 裁剪一条线段时,先求出两端点所在的区号code1和code2,若code1 = 0且code2 = 0,则说明线段的两个端点均在窗口内,那么整条线段必在窗口内,应取之,如图中的线段L3;若code1和code2经按位与运算的结果不为0,则说明两个端点同在窗口的上方、下方、左方或右方。如图中的线段L1,其两端点的编码与运算的结果code1 code2 = 1000,左起第一位不为0说明两端点均在窗口上方,L1肯定在窗口之外。这种情况下,对线段的处理是弃之。 如果上述两种条件都不成立,则按第三种情况处理。求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可弃之,对另一段则重复上述处理。 5.1 裁剪 Cohen-Sutherland编码裁剪算法的C程序如下: #define LEFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 void encode(float x, float y, float XL, float XR, float YB, float YT, int* code) { int c = 0; if (xXL) c = c|LEFT; else if (xXR) c = c|RIGHT; if (yYB) c = c|BOTTOM; else if(yYT) c = c|TOP; *code=c; return; } 5.1 裁剪 void C_S_LineClip(float *x1, float *y1, float *x2, float *y2, float XL, float XR, float YB, float YT) { int code1,code2,code; float x, y; encode(x1, y1, XL, XR, YB, YT, code1); encode(x2, y2, XL, XR, YB, YT, code1); 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); } 5.1 裁剪 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); } 5.1 裁剪 if (code==code1){ *x1 = x; *y1 = y; encode(x, y, XL, XR, YB, YT, code1); } else{ *x2 = x; *y2 = y; encode(x, y, XL, XR, YB, YT, code2); } } return; } 5.1 裁剪 5.5.3 多边形裁剪 多边形的裁剪算法主要要解决两种情况: (1)一个封闭的多边形被裁剪后通常变得不

您可能关注的文档

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档