计算机图形学第3章二维基本图(4).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机图形学第3章二维基本图(4)教材 谢谢 3.3.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)种子象素入栈。 (2)栈非空时象素出栈,否则结束。 (3)对出栈象素及左、右两边象素填充,直到遇边界XL、XR。 (4)在(XL ,XR) 内查相临的上、下两条扫描线是否为边界或已填充, 如不是,则将每区间的最右边的象素入栈。回到(2)。 练习: 用扫描线种子填充算法,写出图中顺序进栈的种子坐标及所需最大栈空间 ????????????????? ??? 顺序进栈的种子坐标为: ??? (1,2)、(2,3)、(2,1)、(4,4)、(2,4) ??? 所需最大栈空间为:2 作业: 用扫描线种子填充算法写出图中所示的顺序进栈的种子坐标和需要最大的栈空间?   图中:初始种子坐标:(5,1),红点表示边界,蓝点表示种子。 三、扫描线种子填充算法特点 1、该算法考虑了扫描线上象素的相关性,种子象素不再代表一个孤立的象素,而是代表一个尚未填充的区段。 2、进栈时,只将每个区段选一个象素进栈(每个区段最右边或最左边的象素),这样解决了堆栈溢出的问题。 3、种子出栈时,则填充整个区段。 4、这样有机的结合:一边对尚未填充象素的登记(象素进栈),一边进行填充(象素出栈),既可以节省堆栈空间,又可以实施快速填充。 在光栅显示平面上,多边形是封闭的,它是用某一边界色围成的一个闭合区域,填充是逐行进行的,即用扫描线逐行对多边形求交,在交点对之间填充。边标志填充算法就是在逐行处理时,利用边界色作为标志来进行填充的。例如某扫描线从左到右扫描时碰到边界色,立刻改变标志的状态,接下来再根据标志的状态决定某象素点是否填充。 3.3.3边标志填充算法 一、边标志填充算法思想  扫描线具有连贯性,这种连贯性只有在扫描线与多边形相交处才会发生变化,而每次的变化结果:无非是在前景色和背景色之间相互“切换”。  边标志填充算法正是基于这一发现,先在屏幕上生成多边形轮廓线,然后逐条扫描处理。处理中:逐点读取象素值,若为边界色,则对该象素值进行颜色切换。   二、边标志填充算法实现 1、用边界色画出多边形轮廓线,也就是将多边形边界所经过的象素打上边标志。 2、为了缩小范围,加快填充速度,须找出多边形的最小包围盒:xmin、ymin、xmax、ymax。如下图所示。  边标志填充算法 3、逐条扫描线进行处理,对每条扫描线依从左往右的顺序,逐个访问该扫描线上的象素。每遇到边界象素,标志取反。然后,按照标志是否为真,决定象素是否为填充色。 三、边标志填充算法特点 该算法思想简单,实现容易。既不需要求交点、交点排序、边的登记,也不需要使用链表、堆栈等数据结构。 四、边标志填充算法程序 EdgeMarkFill(int p[][2],int n,int boundarycolor,int newcolor) {  int i,x,y,flag,xmin,xmax,ymin,ymax;  setcolor(boundarycolor); /*设置画笔色*/  for(i=0 ;in;i++)   line(p[i][0],p[i][1],p[(i+1)%n][0],p[(i+1)%n])[1]); /*画出多边形的n条边*/  用求极值的算法,从多边形顶点数组p中,求出xmin,xmax,ymin,ymax;  for(y=ymin;y=ymax;y++)  {   flag=-1;   fo

文档评论(0)

676200 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档