- 1、本文档共48页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
_计算机图形学.ppt
3.2 实区域填充算法 确定待填充的象素,即检查光栅的每一像素是否位于多边形区域内 点在多边形内的包含性检验 检验夹角之和 射线法检验交点数 检验夹角之和 若夹角和为0,则点p在多边形外 射线法检验交点数 逐点测试效率低不实用怎么办? 包围盒法 实区域填充算法分类 扫描线填充算法---扫描线顺序 有序边表算法 边填充算法 种子填充算法---内部一个点出发 简单种子算法 扫描线种子算法 扫描线填充算法 填充扩大化问题 顶点交点的计数问题 有序边表算法 影响一般扫描线填充算法效率的因素? 有序边表算法 与当前扫描线相交的边称为活性边(active edge),把它们按与扫描线交点x坐标递增的顺序存入一个链表中,边的活性边表 ( AEL, Active edge table)。它记录了多边形边沿扫描线的交点序列。 只需对当前扫描线的活性边表作更新,即可得到下一条扫描线的活性边表。 有序边表算法 如何计算下一条扫描线与边的交点。 直线方程:ax+by+c = 0 当前交点坐标:(xi, yi) 下一交点坐标:(xi+1,yi+1) xi+1= ((-byi+1)-c)/a = ((-byi-b)-c)/a =xi-b/a=xi+1/k 活动边表中需要存放的信息: x:当前扫描线与边的交点 △x=-b/a:从当前扫描线到下一条扫描线之间的x增量 ymax:边所交的最高扫描线 有序边表算法 活性边表的更新 为了方便边的活性边表的更新,建立另一个表-新边表,存放在该扫描线第一次出现的边。 存放的信息: x:扫描线与该边的初始交点 △x:x的增量 ymax:该边的最大y值 step1:把新边表ET[i]中的边结点,用插入排序法 插入活性边表AET,使之按X坐标递增顺序排序; step2:遍历AET表,把配对交点之间的区间(左闭右开)上的各 象素(X,Y),用drawpixel(x,y,color)改写象素颜色值; step3:遍历AET表,把Ymax=i的结点从AET表中删除,并把 Ymax>i的结果点的X值递增△X; step4:重复各扫描线 有序边表算法 优点: 对每个像素只访问一次 与设备无关 边填充算法 边填充算法 优点: 最适合于有帧缓存的显示器 可按任意顺序处理多边形的边 仅访问与该边有交点的扫描线上右方的像素,算法简单 缺点: 对复杂图形,每一像素可能被访问多次,输入/输出量大 图形输出不能与扫描同步进行,只有全部画完才能打印 栅栏填充算法 引入栅栏的目的? 种子填充算法 种子填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。种子填充算法要求区域是连通的 种子填充算法 假设多边形区域内至少有一个像素已知 区域连通方式对填充结果的影响 简单的种子填充算法(4连通边界) 种子像素入栈,当栈非空时,重复以下步骤: (1)栈顶像素出栈 (2)将出栈象素置成填充色 (3)按右、上、左、下顺序检查与出栈象素相邻的四象素,若其中某象素不在边界上且未被置成填充色,则将其入栈 填充算法演示 4-connected boundary-fill void BoundaryFill4(int x,int y,int fill,int boundary) { int current; current = getpixel(x, y); if ((current != boundary) (current != fill)) { putpixel(x, y, fill); BoundaryFill4(x+1, y, fill, boundary); BoundaryFill4(x-1, y, fill, boundary); BoundaryFill4(x, y+1, fill, boundary); BoundaryFill4(x, y-1, fill, boundary); } } 简单的种子填充算法 该算法也可以填充有孔区域。 缺点: (1) 有些象素会入栈多次,降低算法效率;栈结构占空间。 (2) 递归执行,算法简单,但效率不高,区域内每一象素都引起一次递归,进/出栈,费时费内存。 改进算法,减少递归次数,提高效率。 解决方法是用扫描线种子填充算法 扫描线种子填充算法 目标:减少递归层次 适用于边界表示的4连通区域 算法思想: 在任意不间断区间中只取一个种子像素(不间断区间指在一条扫描线上一组相邻元素),填充当前扫描线上的该段区间;然后确定与这一区段相邻的上下两条扫描线上位于区域内的区段,并依次把它们保存起来
文档评论(0)