10二维裁剪.ppt

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 二维裁剪 中国地质大学(北京) 地球物理与信息技术学院 裁剪定义 裁剪对象和窗口 处理裁剪 一、点在窗口内外的判断 裁剪窗口可以是多边形,最简单的就是矩形,规定其两个对角顶点的坐标即可确定。 在矩形窗口的条件下,判断点是否在区域内部非常简单,即只要判断点的坐标和矩形顶点坐标的大小。 当 xl=x=xryb=y=yt 时,此点在区域内,否则在外。 二、线段在窗口内外的判断 图示 三、Cohen-Sutherland算法 由Dan Cohen和Ivan SutherLand提出的,其思想:如果线段的两个端点都在裁剪窗口内部,那么整条线段就在窗口内,该线段完全可见;如果两个端点同时位于窗口某一边界的外面,那么整条线段在外面,不可见;对于非这两种情况的线段,求线段和窗口边界的交点,分线段为两部分,其中一部分完全在窗口外,不可见,舍弃之,考虑另一段(重复上面的判断过程)。 划分区域 编码的含义 这样的编码方法将窗口及其邻域分为9个区域: 这就带来二个优点: 1、容易将不需剪裁的线段挑出 规则是: 如果两个端点的编码全为0,则完全可见,直接显示不需裁剪 如果线段的两个端点位于同一个域(上域、下域、左域、右域),它们的编码按位与不全为0,该线段显然不可见,不需剪裁; 否则,该线段为可能剪裁线段。 算法 如何求交点 然后,计算交点 线段的两个端点(x1,y1),(x2,y2)则线段方程可以表示为: 算法流程 算法实现 编码 编码 多边形裁剪 错觉:直线段裁剪的组合? 多边形的裁剪比直线裁剪复杂。如果套用直线裁剪算法对多边形的边作剪裁的话,剪裁后的多边形之边就会成为一组彼此不连贯的折线,成为不封闭的多边形,从而给填色带来困难 一、Sutherland-Hodgman算法 分割处理策略:将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪。 流水线过程(左上右下):左边的结果是上边的开始。 令多边形的顶点按边线顺时针/或逆时针走向排序:P1, P2, …, Pn。则该多边形由P1P2,P2P3, …… PnP1共n条边首尾相接组成。 各边先与上窗边求交。求交后删去多边形在窗之上的部分,并插入上窗边及其延长线的交点之间的部分 ,从而形成一个新的多边形。 然后,新的多边形按相同方法与右窗边相剪裁。如此重复,直至与各窗边都剪裁完毕。 多边形与每一条窗边的裁剪,是依次处理多边形各顶点并生成新多边形顶点序列的过程, 。 如何确定新多边形的顶点? 情况1:如果s, p均在窗边之内侧,那么,将p保存。 情况2:如果s在窗边内侧,p在外侧,那么,求出sp边与窗边的交点i,保存i,舍去p。 情况3:如果s, p均在窗边之外侧,那么,舍去p。 情况4:如果s在窗边之外侧,p在内侧,那么,求出sp边与窗边的交点i,依次保存i和p。 算法程序 typedef struct{ float x,y; }Vertex; typedef Vertex Edge[2]; typedef Vertex Vertexarray[MAX];/*MAX允许的多边形最大顶点个数 void Intersect(Vertex *s, Vertex *p, Edge clipBoundary, Vertex *I) { if(clipBoundary[0].y==clipBoundary[1].y)//表示水平裁剪窗边 { I-y=clipBoundary[0].y; I-x=s-x+(clipBoundary[0].y-s-y)*(p-x-s-x)/(p-y-s-y); } else //表示垂直裁剪窗边 { I-x=clipboundary[0].x; I-y=s-y+(clipBoundary[0].x-s-x)*(p-y-s-y)/(p-x-s-x); } } 算法程序 boolean Inside (Vertex * textVertex, Edge clipBoundary) { if(clipBoundary[1].xclipBoundary[0].x) //裁剪边为窗口下边 { if(testVertex-y=clipBoundary[0].y)

文档评论(0)

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

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

1亿VIP精品文档

相关文档