第6讲 扫描转换及区域填充.ppt

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

区域填充的递归算法 已知条件: G为一内点表示的区域 (x,y)为区域内一点 old_color为G的原色 现取(x,y)为种子点对区域G进行填充: 即先置像素(x,y)的颜色为new_color 然后逐步将整个区域G都置为同样的颜色。 区域填充的递归算法 步骤如下: 种子像素入栈,当栈非空时,执行如下三步操作: (1)栈顶像素出栈; (2)将出栈像素置成多边形色; (3)按上、下、左、右的顺序检查与出栈像素相邻的四个像素,若其中某个像素不在边界上且未置成多边形色,则把该像素入栈。 s1 2 3 4 9 8 7 6 5 11 12 13 14 10 递归算法 例:多边形P0(1,5)P1(5,5)P2(7,3)P3(7,1)P4(1,1) 种子点为(3,3) 搜索的方向是上、下、左、右。 内点表示的四连通区域的递归填充算法 void FloodFill4(int x,int y,int oldcolor,int newcolor) { if(getpixel(x,y)==oldcolor) //属于区域内点oldcolor { drawpixel(x,y,newcolor); FloodFill4(x,y+1,oldcolor,newcolor); FloodFill4(x,y-1,oldcolor,newcolor); FloodFill4(x-1,y,oldcolor,newcolor); FloodFill4(x+1,y,oldcolor,newcolor); } } 递归算法 边界表示的四连通区域的递归填充算法 void BoundaryFill4(int x,int y,int boundarycolor,int newcolor) { int color; if(color!=newcolor color!=boundarycolor) { drawpixel(x,y,newcolor); BoundaryFill4 (x,y+1, boundarycolor,newcolor); BoundaryFill4 (x,y-1, boundarycolor,newcolor); BoundaryFill4 (x-1,y, boundarycolor,newcolor); BoundaryFill4 (x+1,y, boundarycolor,newcolor); } } 递归算法 递归算法 假设在多边形内一个像素已知,由此出发利用连通性找到区域内的所有像素。 内点检测条件 用来判断任何一个检测像素点(x,y)是不是尚未填充 内点表示 边界表示 if(getpixel(x,y)!=边界色 getpixel(x,y)!=填充色) if(getpixel(x,y)==原色) 递归算法特点 (1) 有些像素会入栈多次,降低算 法效率;栈结构占空间。 (2) 递归执行,算法简单,但效率 不高,区域内每一像素都引起 一次递归,进/出栈。 改进算法,减少递归次数,提高效率。 方法之一使用扫描线填充算法; 扫描线填充算法 算法思想 扫描线填充算法 首先填充当前扫描线上的位于给定区域内的一区段 然后确定与这一区段相邻的上下两条扫描线上位于该区段内是否存在需要填充的新区段 如果存在,则依次把它们保存起来。反复这个过程,直到所保存的各区段都填充完毕。 算法思想 算法实现 1、初始化堆栈。   2、种子压入堆栈。   3、while(堆栈非空)     {      (1)从堆栈弹出种子像素。      (2)如果种子像素尚未填充,则:        a.求出种子区段:xleft、xright;        b.填充整个区段。        c.检查相邻的上扫描线的xleft≤x≤xright区间内,是否存在需要填充的新区段,如果存在的话,则把每个新区段在xleft≤x≤xright范围内的最右边的象素,作为新的种子象素依次压入堆栈。        d.检查相邻的下扫描线的xleft≤x≤xright区间内,是否存在需要填充的新区段,如果存在的话,则把每个新区段在 xleft≤x≤xright范围内的最右边的象素,作为新的种子象素依次压入堆栈。      } 算法演示 扫描线填充算法 1、该算法考虑了扫描线上象素的相关性,种子象素不再代表一个孤立的象素,而是代表一个尚未

文档评论(0)

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

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

1亿VIP精品文档

相关文档