第五讲_区域填充技术分析.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
区域填充的两种 算法及其改进 周锡峰 宛沪生 郑晓坤 一种改进的活性边表区域填充算法 传统的活性边表算法在扫描之前需要先建立关于整个多边形的邻接表以存储初始活性边,在填充阶段又要对每一条扫描线的前一条扫描线对应的活性边列表进行判断和处理,过程较为麻烦。当多边形较复杂时,需要较大的空间开销和时间开销。  事实上,传统算法对多边形顶点信息利用不够:根据顶点编号的连续性和多边形边的邻接关系,不需要事先存储活性边表,活性边总能在扫描线移动到新的顶点处时被发现。可以对多边形各顶点按逆时针顺序编号,将顶点编号存入一个数组,并将数组按顶点的Y 坐标升序排列。填充时,沿Y 轴自下而上扫描多边形。开始时活性边表为空,每到一个新的顶点处时,通过多边形顶点编号及其连续性即可找到邻接该顶点的两条边,如果边的Ymax大于当前扫描线的Y 值,则将该边加入活性边表,保持按X 升序排列;否则,表明该活性边已处理完毕,将其从活性边表删除。然后求取当前扫描线与各活性边的交点,对交点进行两两配对,填充配对点之间的区域。扫描线不断上移,直到到达Y 最大值处的多边形顶点。 与原始算法相比,这是一种动态发现活性边的机制。算法经过这样改进之后,取得了以下几点显著效果: (1)无需对多边形进行预处理以建立活性边邻近表,从而节省了计算时间和存储活性边的空间。 (2)不必在每一条扫描线处都检查上一条扫描线的活性边数组,省去了大量的判断和处理过程,整个填充过程变得更加流畅。 (3)经过排序后,在上下两个多边形顶点之间,由于不存在活性边结点,避免了原始算法中多活性边结点的冗余判断,进一步提高了算法效率。 那么该如何正确地填充自相交的多边形,原始算法并不针对自相交多边形,对这部分内容,文献中也很少有介绍。基于此,本文提出一种简单有效的多边形自相交点探测方法,以实现对自相交多边形的正确填充。自相交多边形是指不共端点的边存在相交情形的多边形,边的交点即为多边形的自相交点。正确填充自相交多边形,其关键在于能准确发现自相交点。一种简单的方法是对多边形边进行两两求交,其时间复杂度为O(n2) ,涉及到边的相交检测和交点计算,过程麻烦。本文提出一种新的方法,如图2,在自相交处之前,点A 在点B 的前面,而在自相交之后,点A′ 在点B′ 的后面,因此,只需在自相交处交换两个活性边结点的前后顺序即可,这样在扫描线填充时就能正确完成交点配对,实现对自相交多边形的正确填充。理论上讲,在自相交处,两条多边形边的X 坐标应该相等,但由于计算机存储数据时舍入误差的存在,交点通过X 值相等或X 值之差的绝对值小于某一误差限的方法很难以被探测。此时,将方案调整如下:扫描过程中处理活性边结点时,比较当前结点的X 坐标与前面结点的X 坐标,如果小于或等于前面结点的X 坐标值,则表明当前处在自相交点或刚刚经过自相交点,这时交换这两个结点的前后位置即可。 算法的其他关键过程 (1)活性边的发现与删除原始的活性边表算法基于预先建立的邻接表来现活性边。改进算法是先建立一个存放多边形顶点编号的数组,依据顶点编号的连续性在扫描过程中动态发现活性边。 (2)扫描线与活性边交点坐标的计算计算活性边上某Y 值处对应点的X 坐标,容易想到的方法是利用直线方程f (x,y) = 0, 将Y 带入直线方程求解X 。但由于Y 是按dy = 1 累加的,因此有更简单的方法:只需要求出dy = 1 对应的dx 即可,则 y′ = y + 1 x′ = x + dx 其中,dx = 1/k,k 为直线斜率。在计算过程中,及时保存当前x ,则下一个x 可根据上述公式直接计算。 下面,采用伪代码的形式给出算法的完整描述: 1.定义数组ptID[N],用于存储多边形的N个顶点的序号,并将ptID[]内的各元素按顶点的Y坐标升序排列 2.建立活性边表,置初始活性边表为空 3.for:i=0 to N-1 3.1 找到id=ptID[i]的多边形顶点,将当前扫描线的Y坐标作为当前扫描线的Y值 3.2 找到与当前顶点相关联的另外两条边,如果边的Ymax大于扫描线的Y 值,则将该边加入活性边列表,保持结点按X 大小升序排列;否则,如果该边在活性边列表,则将该边从活性边表删除 3.3while(Ypoint[id+1].y) 3.3.1 计算当前扫描线与各活性边的交点,按交点出现的先后顺序依次两两配对,填充配对交点之间的多边形区域。在此过程中,如果发现后面一个结点的X 值小于或等于前面一个结点的X值,说明出现了自相交情形,则交换这两个结点的前后位置 3.3.2Y++4.算法结束 第二组实验用于测试算法填充效率。为方便填充自相交多边形,比较与原始算法的运算效率,将本文

文档评论(0)

过各自的生活 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档