- 1、本文档共68页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章 基本图形的生成(二)
例子 * 内蒙古大学计算机图形学 * 已知多边形P=(P0P1P2P3P4P5P6P0);其各边坐标分别为 [(2,5)(2,10)(9,6)(16,11)(16,4)(12,2)(7,2)] 建立其边表和边的活化链表 例子 * 内蒙古大学计算机图形学 * 边表 * 内蒙古大学计算机图形学 * * 内蒙古大学计算机图形学 * 活动边表的例子 y=3 Y=8 算法实现步骤 * 内蒙古大学计算机图形学 * 这样,当建立了边的分类表ET后,扫描线算法可按下列步骤进行: (1)取扫描线纵坐标y的初始值为ET中非空元素的最小序号。 (2)将边的活化链表AEL设置为空。 (3)按从下到上的顺序对纵坐标值为y的扫描线(当前扫描线)执行下列步骤,直到边的分类表ET和边的活化链表都变成空为止。 算法实现步骤 * 内蒙古大学计算机图形学 * 1)如边分类表ET中的第y类元素非空,则将属于该类的所有边从ET中取出并插入边的活化链表中。递增方向排序。2)若相对于当前扫描线,边的活化链表AEL非空,则将AEL中的边两两依次配对,依此类推。并填色。 3)将边的活化链表AEL中满足y=ymax的边删去。 4)x:=x+Δx。5)y:=y+1。 扫描线算法 * 内蒙古大学计算机图形学 * 特点:算法效率比逐点填充法高很多。 缺点:对各种表的维持和排序开销太大,适合软件实现而不适合硬件实现。 扫描线算法 * 内蒙古大学计算机图形学 * 问题: 如何处理多边形的水平边? 如何修改扫描线算法,使它能处理边自交的多边形?有孔的多边形如何处理? 如何处理圆、椭圆的扫描线算法? 边缘填充算法 * 内蒙古大学计算机图形学 * ▼求余运算:假定A为一个正整数,则M的余定义为A – M, 记为 。计算机中取A为n位能表示的最大整数。即,A=0xFFFFFFFF ▼由来:光栅图形中,如果某区域已着上值为M的颜色值做偶数次求余运算,该区域颜色不变;而做奇数次求余运算,则该区域颜色变为值为 的颜色。这一规律应用于多边形扫描转换,就为边缘填充算法。 ▼算法基本思想:对于每条扫描线和每条多边形边的交点,将该扫描线上交点右方的所有象素取余。 算法1(以扫描线为中心的边缘填充算法) * 内蒙古大学计算机图形学 * 1、将当前扫描线上的 所有象素着上 颜色; 2、求余: for(i = 0;i = m; i++) 在当前扫描线上, 从横坐标为Xi的交 点向右求余; 算法2(以边为中心的边缘填充算法) * 内蒙古大学计算机图形学 * 1、将绘图窗口的背景色置为 ; 2、对多边形的每一条非水平边做: 从该边上的每个象素开始向右求余; 边缘填充算法 * 内蒙古大学计算机图形学 * 适合用于具有帧缓存的图形系统。处理后,按扫描线顺序读出帧缓存的内容,送入显示设备。 优点:算法简单 缺点:对于复杂图形,每一象素可能被访问多次,输入/输出的量比有序边表算法大得多。 栅栏填充算法 * 内蒙古大学计算机图形学 * 引入栅栏,以减少填充算法访问象素的次数。 栅栏:与扫描线垂直的直线,通常过一顶点,且把多边形分为左右二半。 基本思想:扫描线与多边形的边求交,将交点与栅栏之间的象素取补。 减少了象素重复访问数目,但不彻底。 * 内蒙古大学计算机图形学 * 边界标志算法 1. 对多边形的每一条边进行扫描转换,即对多边形边界所经过的象素作一个边界标志。 2.填充。对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象素。 取一个布尔变量inside来指示当前点的状态,若点在多边形内,则inside为真。若点在多边形外,则inside为假。 Inside 的初始值为假,每当当前访问象素为被打上标志的点,就把inside取反。对未打标志的点,inside不变。 边界标志算法:算法过程 * 内蒙古大学计算机图形学 * void edgemark_fill(polydef, color) 多边形定义 polydef; int color; { 对多边形polydef 每条边进行直线扫描转换; inside = FALSE; for (每条与多边形polydef相交的扫描线y ) for (扫描线上每个象素x ) { if(象素 x 被打上边标志) inside = ! (inside); if(inside!= FALSE) drawpixel (x, y, color); else drawpixel (x, y, background); } }
文档评论(0)