扫描线多边形填充算法_第1页
扫描线多边形填充算法_第2页
扫描线多边形填充算法_第3页
扫描线多边形填充算法_第4页
扫描线多边形填充算法_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、关于扫描线多边形填充算法第一张,PPT共三十页,创作于2022年6月1区域内部点判断准则 区域填充首先判断一个像素点是否处于多边形区域内,其判断准则如下: 从该点向无穷远处引出一条射线(也称扫描线),若射线与区域边界交点目标数目为奇数,则此点在区域内。若射线与区域边界交点目标数目为偶数,则此点为区域外点。例如:A点向右引射线与区域边界共3个交点,为内点B点向右引射线与区域边界共2个交点,为外点AB第二张,PPT共三十页,创作于2022年6月此时应注意两点:(1)当扫描线与多边形相交如下情况时:YXAIBEDCF若两相邻边与扫描线相交于同一点,且两边位于扫描线同侧,则视为两个交点。如yb:1点向

2、右交点为3个(奇数)是内点 3点向右交点为4个(偶数)是外点若两相邻边与扫描线相交于同一点,且两边位于扫描线异侧,则视为一个交点。如yayb31ya第三张,PPT共三十页,创作于2022年6月(2)当扫描线重合多边形某条边界水平线时,如该水平边线前后两条边线是一上一下的,则该水平边线两个端点作为一个交点,即扫描线与该水平边界线相交了一次。 如下图yCBXYDCBAE如该水平边线前后两条边线是同为上或同为下的,则将该水平边线两个端点作为交点,即扫描线与该水平边界线相交了两次。如yDEyCByDE第四张,PPT共三十页,创作于2022年6月 2边相关性及边记录 很显然,不能利用区域内部点判别准则对

3、显示平面上每个点逐个判别,这样计算量太大。 事实上,相对于一个给定多边形区域来说,显示平面上每个像素点内外特性是互相关联的。相邻像素间具有相关属性。在实施多边形填充时,利用扫描线相关性,就无需对扫描线上所有像素点逐个地进行内外特性判断,只需对一条扫描线从左到右求出该扫描线与区域边界交点,这些交点必将扫描线分成内外交替线段,这些交点x值大小依次排列。 第五张,PPT共三十页,创作于2022年6月XYABCD如上图,按x从小到大排列为A B C D交点AB间线段上像素点必在区域内。所以关键是求交点。第六张,PPT共三十页,创作于2022年6月 (1)交点计算 多边形填充首先需要求出扫描线与边界的交

4、点,利用边的相关性可以简单有效地解决这个问题。当一条扫描线yi 与多边形的某一边线有交点时,其相邻扫描线yi+1一般也与该边线相交(除非yi+1超出了该边线所在区间),而且扫描线yi+1与该边线的交点,很容易从前一条扫描线yi与该边的交点递推求得。 设某条直线边的方程为 y=mx+b 该边两个端点坐标为(x1,y1)、(x2,y2) 且x1x2 则该边斜率为m=(y2-y1)/(x2-x1) 令扫描线yi与该边交点为(xi,yi) 扫描线yi1与该边交点(xi1,yi1)第七张,PPT共三十页,创作于2022年6月 A(8,2)C(8,8)B(3,7)yi(xi,yi)边线AB第yi条扫描线与

5、某边线AB的交点是(xi,yi) 第yi+1条扫描线与AB的交点为(xi+1, yi+1 )则第yi+1条扫描线与AB的交点为yi+1=yi+1, xi+1=xi+1/m 即由前一条扫描线交点Xi,Yi求下一条扫描线交点Xi1,Yi+1,式中,m是这条边的斜率。(xi+1, yi+1)边线AC1/myi+1第八张,PPT共三十页,创作于2022年6月(2)边记录利用边的这种相关性,不必算出边线与各条扫描线的全部交点,只需以边线为单位,对每条边建立一个边记录,其内容包括:该边y的最大值ymax ,该边底端的x坐标xi,从一条扫描线到下一条扫描线间的x增量1/m,以及指示下一个边记录地址的指针 7

6、 8 18 8 0ABACymax xi 1/m ymax xi 1/m A(8,2)C(8,8)B(3,7)第九张,PPT共三十页,创作于2022年6月3边表ET和活动边表AET (1)边表ET (Edge Table)边表是一个包含多边形全部边记录的表,它按y坐标(与扫描线一一对应)递增(或递减)的顺序存放区域边界的所有边。每个y坐标值存放一个或者说几个边记录。当某条扫描线yi碰到多边形边界的新边时(以边线底端为准),则在ET表中相应的y坐标值处写入一个边记录。当同时有多条边进入时,则在ET表中按链表结构写入相应数目的多个记录,这些记录是按边线较低端点的x值增加的顺序排列。当没有新边加入时

7、,表中对应的y坐标值处存储内容为空白。ymax xi 1/m 第十张,PPT共三十页,创作于2022年6月注意:在ET表中:与x轴平行的边不计入。多边形的顶点分为两大类:一类是局部极值点,如下图中的P1、P3;另一类是非极值点,如下图中的P2、P4、P5。当扫描线与第一类顶点相遇时,应看作两个点;当扫描线与第二类顶点相遇时,应视为一个点。 多边形边表多边形边表边表ymax xi 1/m 第十一张,PPT共三十页,创作于2022年6月活动边表AET(Activities Edge Table) 活动边表AET是一个只与当前扫描线相交的边记录链表。随着扫描线从一条到另一条的转换,AET表也应随之变

8、动,利用 yi+1=yi+1, xi+1=xi+1/m 可以算出AET表中x域中的新值xi。凡是与这一条扫描线相交的任何新边都加到AET表中,而与之不相交的边又被从AET表中删除掉了。下图列出了多边形图在扫描线为4、5、6时的AET表。AET表中的记录顺序仍是按x增大排序的。 第十二张,PPT共三十页,创作于2022年6月4多边形区域填充算法过程 (1)根据给出的顶点坐标数据,按y递增顺序建立ET表(2)根据AET指针,使之为空。(3)使y=Ymin (Ymin为顶点坐标中最小y值)。(4)反复做下述各步,直至y=Ymax(顶点坐标中y的最大值)或ET与AET为空: 将ET表加入到AET中,并

9、保持AET链中的记录按x值 增大排序。 对扫描线yi依次成对取出AET中xi值,并在每对xi 之间填上所要求的颜色或图案。 从AET表中删去yi=ymax的记录。 对保留下来的AET中的每个记录,用xi+1/m代替xi ,并重新按x递增排序。 使yi+1,以便进入下一轮循环。第十三张,PPT共三十页,创作于2022年6月开始y1,将ET表中y1结点加入至AET表,同时保持AET链中记录按x增大排序3 6 -25 6 0.5 AET由于上例中是66,是顶点,所以中间不填像素颜色。上例由于Ymax3和5,所以不必删去,当yi3时,此时就得将第一个结点即(3,6,2)删去。对保留下来的AET中的每个

10、记录,用xi+1/m代替xi,并重新按x递增排序。如上例变成(实际求出y=2时新的交点x坐标):3 4 -2 5 6.5 0.5 AET第十四张,PPT共三十页,创作于2022年6月使yi+1,以便进入下一轮循环。即y2再进入以上循环继续:由y2,ET表中是空,所以不需ET表加入AET表 取x4和x6.5,将46.5之间填上像素颜色。 由于y=2,不必删去结点。 再改变xi的值为 使yi 3,重复继续。继续:由y3,将ET表中y3结点加入,即 将27之间填上像素颜色。 删去结点Ymax3 结点。3 2 -2 5 7 0.5 AET3 2 -25 7 0.5 AET6 2 06 2 05 7 0

11、.5 AET3 4 -2 5 6.5 0.5 AET第十五张,PPT共三十页,创作于2022年6月 再改变xi的值为 使yi 4,重复继续。 6 2 05 7.5 0.5 AET第十六张,PPT共三十页,创作于2022年6月P0P1P2P3P4P5举例演示第十七张,PPT共三十页,创作于2022年6月二、 边填充 边填充算法的基本原理是:(1)对多边形的每条边进行直线扫描转换,即对多边形边界经过的像素打上边标志;(2)对多边形内部进行填充。填充时,对每条扫描线,依从左到右的顺序,逐个访问扫描线上的像素,用一个布尔量来标志当前点是在多边形内部还是外部(一开始设布尔量的值为假,当碰到设有边标志的点

12、时,就把其值取反;对没有边标志的点,则其值保持不变)(3)将其布尔量值为“真”的内部置为图形色,把其布尔量的值为“假”的外部点置为底色即可。 第十八张,PPT共三十页,创作于2022年6月三、 种子填充 1、种子填充基本思路 首先假设在多边形区域的内部,至少有一个像素点(称为种子)是已知的,然后算法开始搜索与种子点相邻且位于区域内的其它像素。如果相邻点不在区域内,那么到达区域的边界;如果相邻点位于区域内,那么这一点就成为新的种子点,然后继续递归地搜索下去。 区域的连通情况可以分为四连通和八连通两种四连通区域:各像素在水平和垂直四个方向上是连通的.八连通区域:各像素在水平、垂直以及四个对角线方向

13、上都是连通的。 第十九张,PPT共三十页,创作于2022年6月 在种子填充算法中,如果允许从四个方向搜寻下一个像素点,则该算法称为四向算法;如果允许从八个方法搜寻下一个像素点,则该算法称为八向算法。 一个八向算法可以用在四连通区域的填充上,也可用在八连通区域的填充上;而一个四向算法只能用于填充四连通区域。 无论是四向算法还是八向算法,它们的填充算法基本思想是相同的。为简单起见,下面只讨论四向种子填充算法。 第二十张,PPT共三十页,创作于2022年6月2. 种子填充算法基本思想:假设在多边形区域内部至少有一个像素是已知的(此像素称为种子像素),由此出发找到区域内所有其他像素,并对其进行填充。由

14、于区域可采用边界定义和内点定义两种方式,区域按连通性又可分为四连通区域和八连通区域两类,所以常用的种子填充算法有:边界表示的四连通区域种子填充算法内点表示的四连通区域种子填充算法边界表示的八连通区域种子填充算法内点表示的八连通区域种子填充算法第二十一张,PPT共三十页,创作于2022年6月(1)边界表示的四连通区域种子填充算法基本思想:从多边形内部任一点(像素)出发,依“左上右下”顺序判断相邻像素,若其不是边界像素且没有被填充过,对其填充,并重复上述过程,直到所有像素填充完毕。可以使用栈结构来实现该算法,算法的执行步骤如下:种子像素入栈,当栈非空时,重复执行如下三步操作: 1)栈顶像素出栈;

15、2)将出栈像素置成多边形填充的颜色; 3)按左、上、右、下的顺序检查与出栈像素相邻的四个像素,若其中某个像素不在边界上且未置成多边形色,则把该像素入栈。第二十二张,PPT共三十页,创作于2022年6月边界填充算法(四连通域) 在区域有一个像素是已知(种子像素),由此像素从四个方向遍历区域内所有像素。(适用于交互绘图)0 1 2 3 4 54321用什么方法实现?注意:栈中种子的次序,当前栈顶元素是哪个?依“左上右下”第二十三张,PPT共三十页,创作于2022年6月以边界表示的四连通区域种子填充算法 (基于递归)取(x,y)为种子点Void BoundaryFill4(int x,int y ,

16、int boundarycolor,int newcolor) if(getpixel(x,y)!= boundarycolor & getpixel(x,y)!= newcolor) /* getpixel(x,y)取屏幕上像素(x,y)的颜色*/ putpixel(x,y,newcolor);/着色 BoundaryFill4(x-1,y, boundarycolor, newcolor); BoundaryFill4(x,y+1, boundarycolor, newcolor); BoundaryFill4(x+1,y, boundarycolor, newcolor); Bounda

17、ryFill4(x,y-1, boundarycolor, newcolor); 基本思想:从多边形内部任一点(像素)出发,依“左上右下”顺序判断相邻像素,若其不是边界像素且没有被填充过,对其填充,并重复上述过程,直到所有像素填充完毕。第二十四张,PPT共三十页,创作于2022年6月例:填充如下区域:堆栈的变化如图所示。边界表示的四连通区域种子填充算法基本思想:从多边形内部任一点(像素)出发,依“左上右下”顺序判断相邻像素,若其不是边界像素且没有被填充过,对其填充,并重复上述过程,直到所有像素填充完毕。可以使用栈结构来实现该算法,算法的执行步骤如下:种子像素入栈,当栈非空时,重复执行如下三步操

18、作: 1)栈顶像素出栈; 2)将出栈像素置成多边形填充的颜色; 3)按左、上、右、下的顺序检查与出栈像素相邻的四个像素,若其中某个像素不在边界上且未置成多边形色,则把该像素入栈。第二十五张,PPT共三十页,创作于2022年6月(2)内点表示的四连通区域种子填充算法基本思想:从多边形内部任一点(像素)出发,依“左上右下”顺序判断相邻像素,如果是区域内的像素,则对其填充,并重复上述过程,直到所有像素填充完毕。它也常称为漫水法。可以使用栈结构来实现该算法,算法的执行步骤如下:种子像素入栈,当栈非空时,重复执行如下三步操作: 1)栈顶像素出栈; 2)将出栈像素置成多边形填充的颜色; 3)按左、上、右、

19、下的顺序检查与出栈像素相邻的四个像素,若其中某个像素是区域内的像素,则把该像素入栈。第二十六张,PPT共三十页,创作于2022年6月Void FloodFill4(int x,int y ,int oldcolor,int newcolor) if(getpixel(x,y)=oldcolor) /* getpixel(x,y)取屏幕上像素(x,y)的颜色, oldcolor为区域的原色*/ putpixel(x,y,newcolor);/着色 FloodFill4(x-1,y, oldcolor, newcolor); FloodFill4(x,y+1, oldcolor, newcolor

20、); FloodFill4(x+1,y, oldcolor, newcolor); FloodFill4(x,y-1, oldcolor, newcolor); 内点表示的四连通区域种子填充算法(基于递归)取(x,y)为种子点基本思想:从多边形内部任一点(像素)出发,依“左上右下”顺序判断相邻像素,如果是区域内的像素,则对其填充,并重复上述过程,直到所有像素填充完毕第二十七张,PPT共三十页,创作于2022年6月特点:(1) 有些像素会入栈多次,降低算法效率;栈结构占空间。(2) 递归执行,算法简单,但效率不高,区域内每一像素都引起一次递归,进/出栈,费时费内存。 改进算法,减少递归次数,提高效率。 方法之一使用扫描线填充算法;种子填充法第二十八张,PPT共三十页,创作于2022年6月上述简单种子填充算法操作过程非常简

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论