第四章多边形的扫描转换和区域填充ppt课件.ppt
《第四章多边形的扫描转换和区域填充ppt课件.ppt》由会员分享,可在线阅读,更多相关《第四章多边形的扫描转换和区域填充ppt课件.ppt(105页珍藏版)》请在三一办公上搜索。
1、,第4章 多边形的扫描转换和区域填充,扫描转换和区域填充这个问题是怎样在离散的像素集上表示一个连续的二维图形。,多边形有两种重要的表示方法:顶点表示和点阵表示。,前言,前言,顶点表示用多边形的顶点序列来刻画多边形特点表示方法直观,几何意义强,占内存空间少,但没明确指明哪些像素在多边形内,不能直接用于面着色。,前言,点阵表示用位于多边形内部的像素集合来刻画多边形特点会失去很多重要的几何信息,不过它是光栅显示系统显示面着色时所需的图形表示形式。,前言,把多边形的顶点表示转换为点阵表示,这种转换称为多边形的扫描转换。即,从多边形的给定边界出发,求出位于其内部的各个像素,并给帧缓存器内的各个对应元素设
2、置相应的灰度或颜色。,多边形扫描转换主要用来填充多边形区域以及由多边形拟合的其它简单曲线区域。,取点阵表示的多边形区域的一点,并赋予指定的颜色和灰度,然后将该颜色和灰度扩展到整个区域内的过程。,多边形的扫描转换,区域填充主要用在具有复杂形状边界的多边形以及交互绘图系统中。,内容提要,多边形的扫描转换区域填充技术 直线的扫描转换反走样,4.1.1 多边形的扫描转换,多边形可以为凸多边形、凹多边形、含内环的多边形等:,(1)凸多边形,任意两顶点间的连线均在多边形内。,(2)凹多边形,任意两顶点间的连线有不在多边形内的部分。,凸多边形 凹多边形 含内环的多边形,4.1.2 逐点判断算法,基本思想:逐
3、个判断绘图窗口内的像素,确定它们是否在多边形区域内部,从而求出位于多边形区域内的像素的集合。常用方法射线法,4.1.2 逐点判断算法,基本思想:由被测点向某方向作射线,计算此射线与多边形所有边的交点个数,用交点个数的奇偶性判别多边形与点的关系。判断依据:若交点个数为奇数,则被测点在多边形内部;若交点个数为偶数(包括0),则该点在多边形的外部。,射线法,A,C,B,D,a,b,d,c,4.1.2 逐点判断算法,射线f过顶点,若将交点计数为2,则F点在多边形外。 但若规定射线过顶点时,计数为1,则E在多边形内。,e,f,E,F,1,2,3,4,5,A,B,问题:当射线恰好通过多边形的顶点时,怎么判
4、断?,4.1.2 逐点判断算法,点A: 0个交点,在多边形外点B: 1个交点,在多边形内点C:3个交点,在多边形内点D: 1个交点,在多边形内点E: 2个交点,在多边形外点F: 1个交点,在多边形内(剔除重合边),f,措施在射线左边的边与该射线相交时交点有效,应计数;而在射线右边的边与射线相交时交点无效,不计数。(左闭右开原则),4.1.2 逐点判断算法,算法实现,void FillPolygonPbyP(Polygon *P,int polygonColor) int x,y; for(y = ymin;y = ymax;y+) for(x = xmin;x = xmax;x+)if(IsI
5、nside(P,x,y) PutPixel(x,y,polygonColor);else PutPixel(x,y,backgroundColor);/*end of FillPolygonPbyP()*/,4.1.2 逐点判断算法,算法特点,简单速度太慢由于该算法割断了各像素之间的联系,孤立地考察各像素与多边形的内外关系,使得几十万甚至几百万个像素都要一一判别,每次判别又要多次求交点,需要做大量的乘除运算,花费很多时间。,4.1.3 扫描线算法,一条扫描线上的像素存在着相关性 在多边形边处,像素性质才发生变化 将相邻像素放在一起测试,从而减少测试点的数目,区域特点,扫描线的连贯性,4.1.3
6、 扫描线算法,目标:利用相邻像素之间的连贯性,提高算法效率处理对象:非自相交多边形(自相交多边形指一个顶点 对应的边数大于2),4.1.3 扫描线算法,基本思想,对每一条扫描线,计算扫描线与多边形边界的交点,直接连接扫描线在多边形内的每两个相邻交点,其间的所有像素就一次显示了。然后扫描线上升(下降)一个像素,重复上述工作,直至完成全部填充工作。,求出一根扫描线与多边形各边的交点: 对求得的交点进行排序: 奇偶配对求出扫描线与多边形的相交区间: 对这些相交区间填充。,I4, I3, I2, I1,I1, I2, I3, I4,(I1, I2), (I3, I4),4.1.3 扫描线算法,4.1.
7、3 扫描线算法,存在问题,当扫描线与多边形的顶点相交时,会出现异常情况。问题1:如何取舍重交点,保证交点正确配对?,4.1.3 扫描线算法-顶点交点计数,具体实现:检查重交点对应的两条边的另外两个端点的y值,按这两个y值中大于顶点y值的个数是0、1、2来决定交点是计0次、1次还是2次。,解决方法,重交点的两条边分别落在扫描线两边,取交点1次。 重交点的两条边均高于扫描线,取交点2次。 重交点的两条边均低于扫描线,取交点0次。,检查重交点的两相邻边在扫描线的哪一侧,4.1.3 扫描线算法,填充扩大化:多边形边界上像素的也被填充。问题2:避免填充扩大化?,存在问题,4.1.3 扫描线算法-填充扩大
8、化,解决方法,规定落在右/上边界的像素不予填充,而落在左/下边界的像素予以填充。具体实现:对扫描线与多边形的相交区间,取“左闭右开”,如【1,5),问题1保证了多边形的“下闭上开”,9.3.1扫描线填充算法,可以从三方面考虑加以改进以提高算法效率:,(1)在处理一条扫描线时,仅对和它相交的多边形的边(有效边)进行求交运算。,(2)需要考虑多边形的连贯性,即当前扫描线与各边的交点顺序与下一条扫描线与各边的交点顺序很可能相同或非常相似,这样在当前扫描线处理完毕之后,不必为下一条扫描线从头开始构造交点信息。,9.3.1扫描线填充算法,(3)最后考虑边的连贯性,即当某条边与当前扫描线相交时,它很可能也
9、与下一条扫描线相交。,4.1.3 扫描线算法数据结构,随着扫描线的移动,扫描线与多边形的交点和上一次交点相关:,设边的直线斜率为k,则,x=1/k,活性边表(AET):把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中。,结点内容 x: 当前扫描线与边交点的x坐标 x: 从当前扫描线到下一条扫描线间x的增量ymax: 该边所交的最高扫描线的坐标值ymax,即x=1/k为常量。则下一条扫描线与该边的交点不要重新计算,只要加一个增量x。,如何判断多边形的一条边是否与扫描线相交?,其中x为当前扫描线与边的交点,ymax是边所在的最大扫描线值,通过它可以知道何时才
10、能“抛弃”该边,x表示从当前扫描线到下一条扫描线之间的x增量即斜率的倒数。next为指向下一条边的指针,综上所述,活性边表AET的每个结点存放对应边的有关信息如下:,4.1.3 扫描线算法数据结构,注:对每条与多边形相交的扫描线都会有一个AET,一个多边形与若干扫描线,看扫描线 y = 6 的活性边表:,4.1.3 扫描线算法数据结构,4.1.3 扫描线算法数据结构,活性边表的更新,节点更新新边插入旧边删除,4.1.3 扫描线算法数据结构,为了方便活性边表的建立与更新,需构造一个新边表(NET),用来存放多边形的边的信息,分为3个步骤:,(1)首先构造一个纵向链表,链表的长度为多边形所占有的最
11、大扫描线数,链表的每个结点,称为一个桶,对应多边形覆盖的每一条扫描线。,(2)将每条边的信息链入与该边最小y坐标(ymin)相对应的桶处。也就是说,存放着该扫描线第一次出现的边。若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中。,4.1.3 扫描线算法数据结构,(3)每条边的数据形成一个结点,内容包括:该扫描线与该边的初始交点x(即较低端点的x值),1/k,以及该边的最大y值ymax。,4.1.3 扫描线算法数据结构,一个多边形与若干扫描线,这个结构实际上是一个指针数组,数组的每个变量是个指针,这个指针指向所有的以这个y值作为起点的边。,把多边形所有的边全部填成这样的结构,插到
12、这个指针数组里面来。,如y=1,y=5指向哪些边?,4.1.3扫描线算法步骤,1、 建立NET表;2、将扫描线纵坐标y的初值置为NET中非空元素的最小序号3、置AET为空;4、执行下列步骤直至NET和AET都为空4.1、如NET中的第y类非空,则将其中的所有边取出并插入 AET中;4.2、如果有新边插入AET,则对AET中各边排序;4.3、对AET中的边两两配对,获得有效填充区段,再填充4.4、将当前扫描线纵坐标y值递增1;4.5、将AET中满足ymaxy边删去4.6、对AET中剩下的每一条边的x递增 x,即x = x+ x,4.1.3 扫描线算法,y=2,4.1.3 扫描线算法,算法的执行过
13、程,从新边表中取出与扫描线y=1相交的初始边排序放入活性边表中,填充交点之间的区域,更新边表,删除P1P2,插入新边P6P1,填充交点之间的区域,更新边表,删除P2P3,插入新边P3P4,填充交点之间的区域,4.1.3 扫描线算法,更新边表,插入新边P5P6和P4P5,填充两对交点之间的区域,更新边表,填充两对交点之间的区域,更新边表,删除P6P1和P5P6,填充交点之间的区域,更新边表,删除P4P5和P3P4,活性边表为空,没有新边,填充算法结束,y=8,如何填充?,4舍?还是5入?,当交点的 x 坐标值是小数时需进行舍入运算。,4.1.3 扫描线算法,例:如下图所示多边形,若采用扫描线算法
14、进行填充,试写出该多边形的新边表(NET表)和当扫描线Y=3时的活性边表(AET表)。,注意:NET中,水平边不放在任何桶中,即:水平边不予处理!,4.1.3 扫描线算法,优点:充分利用了三种连贯性,算法效率比逐点填充法高很多。利用边的连贯性来加速交点的计算利用AET以排除盲目求交利用扫描线的连贯性以避免逐点判别缺点:数据结构复杂,对各种表的维护和排序开销太大,适合软件实现而不适合硬件实现。思考:如果多边形为自相交多边形,如何改进算法?,4.1.4 边界标志算法,基本思想对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的像素打上标志;设置一个布尔量inside来指示当前点的状态,若in
15、side为真,则点在多边形内,否则在多边形外,初始状态为假;填充:对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的像素;每当当前访问的像素为被打上标志的点时,就把inside取反。若访问当前像素时,对inside作必要操作之后,inside为真,则把该像素置为多边形色,否则置为背景色。,4.1.4 边界标志算法,边标志算法示意图,y=3,4.1.4 边界标志算法,void edgemark_fill(polydef, color)多边形定义 polydef; int color; 对多边形polydef 每条边进行直线扫描转换; inside = FALSE; for (每条
16、与多边形polydef相交的扫描线y ) for (扫描线上每个象素x ) if(象素x被打上边标志)/两个交点之间的区域填充 inside = ! (inside); if(inside!= FALSE) putpixel (x, y, color); else drawpixel (x, y, background); ,4.1.4 边界标志算法,用软件实现时,扫描线算法与边界标志算法的执行速度几乎相同,,由于边界标志算法不必建立、维护边表以及对它进行排序,所以边界标志算法更适合硬件实现,这时它的执行速度比扫描线算法快一至两个数量级。,4.2 区域填充技术,区域填充是指将区域内的一点(常称
17、种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。,区域-指已经表示成点阵形式的填充图形,是像素的集合。,区域填充算法中,要求区域是连通的。因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。,4.2.1 区域的表示,区域可采用内点表示和边界表示两种表示形式。,内点表示:枚举出区域内部的所有像素,内部的所有像素着同一个颜色,边界像素着与内部像素不同的颜色。,边界表示:枚举出边界上的所有像素,边界上的所有像素着同一个颜色,内部像素着与边界像素不同的颜色。,4.2.1 区域的表示-区域的连通,区域可分为4向连通区域和8向连通区域。,四个方向运动 八个方向运动 四连通区域 八连
18、通区域,4向连通区域指的是从区域上一点出发,可通过四个方向,即上、下、左、右移动的组合,在不越出区域的前提下,到达区域内的任意像素;,8向连通区域是从区域上任一点出发,在不越出区域的前提下,可通过八个方向,即上、下、左、右、左上、右上、左下、右下这八个方向的移动组合来到达区域内任一点。,四连通区域,八连通区域,4.2.1 区域的表示-区域的连通,4.2.1 区域的表示-连通区域的区别,4连通区域也可理解成8连通区域,但是两者的边界不尽相同,4连通区域 号8连通区域 号 号,4.2.2 区域填充算法-种子填充算法,种子,边界表示的四连通区域种子填充算法内点表示的四连通区域种子填充算法边界表示的八
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 多边形 扫描 转换 区域 填充 ppt 课件
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-1356675.html