第4章多边形的转换与区域填充

上传人:无*** 文档编号:182888127 上传时间:2023-01-28 格式:PPT 页数:50 大小:1.72MB
返回 下载 相关 举报
第4章多边形的转换与区域填充_第1页
第1页 / 共50页
第4章多边形的转换与区域填充_第2页
第2页 / 共50页
第4章多边形的转换与区域填充_第3页
第3页 / 共50页
点击查看更多>>
资源描述
第第4章章 多边形的扫描转换与区域填充多边形的扫描转换与区域填充第第4章章 多边形的扫描转换与区域填充多边形的扫描转换与区域填充一、在计算机图形学中,多边形有两种重要的表示方法:一、在计算机图形学中,多边形有两种重要的表示方法:1.1.顶点表示顶点表示u用多边形的顶点序列来刻画多边形用多边形的顶点序列来刻画多边形u顶点表示特点顶点表示特点表示方法直观,几何意义强,占内存空间少,但没指明哪些像素在表示方法直观,几何意义强,占内存空间少,但没指明哪些像素在多边形内,不能直接用于着色。多边形内,不能直接用于着色。多边形的顶点表示多边形的顶点表示第第4章章 多边形的扫描转换与区域填充多边形的扫描转换与区域填充2.2.点阵表示点阵表示v用位于多边形内部或边界上的像素集合来刻画多边形用位于多边形内部或边界上的像素集合来刻画多边形v点阵表示特点点阵表示特点会失去很多重要的几何信息,不过它是光栅显示系统显会失去很多重要的几何信息,不过它是光栅显示系统显示面着色时所需的图形表示形式。示面着色时所需的图形表示形式。多边形的点阵表示多边形的点阵表示第第4章章 多边形的扫描转换与区域填充多边形的扫描转换与区域填充二、多边形填充方式二、多边形填充方式1.多边形扫描转换多边形扫描转换:顶点表示不能直接用于显示,必须要进行从多边形顶点表示到点阵表顶点表示不能直接用于显示,必须要进行从多边形顶点表示到点阵表示的转换,这种转换就是给多边形包围的区域着色的过程,即从多边示的转换,这种转换就是给多边形包围的区域着色的过程,即从多边形的给定边界出发,求出位于其内部的各个像素,并将其灰度和颜色形的给定边界出发,求出位于其内部的各个像素,并将其灰度和颜色值写入帧缓存中相应的单元。主要用来填充多边形区域以及由多边形值写入帧缓存中相应的单元。主要用来填充多边形区域以及由多边形拟合的其他简单曲线区域。拟合的其他简单曲线区域。2.区域填充:区域填充:从给定的位置开始涂描直到指定的边界为止。用在具有复杂形状边界从给定的位置开始涂描直到指定的边界为止。用在具有复杂形状边界的多边形以及交互式绘图系统中。的多边形以及交互式绘图系统中。第第4章章 多边形的扫描转换与区域填充多边形的扫描转换与区域填充n4.1 矩形填充矩形填充n4.2 多边形扫描转换多边形扫描转换n4.3 区域填充区域填充n4.4 多边形扫描转换与区域填充的区别多边形扫描转换与区域填充的区别n4.5 光栅图形的反走样光栅图形的反走样4.1 矩形填充为了将它用指定的颜色均匀填充,只要填充从为了将它用指定的颜色均匀填充,只要填充从y yminmin到到y ymaxmax每条扫每条扫描线位于描线位于x xminmin和和x xmaxmax之间的区段就可以。其程序如下:之间的区段就可以。其程序如下:4.1 矩形填充为了减少函数调用的次数,每条扫描线上的为了减少函数调用的次数,每条扫描线上的xxminmin,x xmaxmax 区间可区间可以用画线函数填充,其程序如下:以用画线函数填充,其程序如下:4.1 矩形填充存在问题:存在问题:如果两个矩形共享一条边:如果两个矩形共享一条边:(1 1)如果象素的中心落在某个矩形区域内,则它属于该区域。)如果象素的中心落在某个矩形区域内,则它属于该区域。(2 2)如果将中心落在其共享边界的像素看成是同时属于两个矩形)如果将中心落在其共享边界的像素看成是同时属于两个矩形图元区域,那么,落在共享边界上的像素就会被重画两次。图元区域,那么,落在共享边界上的像素就会被重画两次。(3 3)如果将中心落在其共享边界的像素看成是不属于任何区域,)如果将中心落在其共享边界的像素看成是不属于任何区域,那么,中心落在共享边界上的像素就会被丢失。那么,中心落在共享边界上的像素就会被丢失。处理措施:处理措施:如果像素的中心落在矩形边界的左方或下方时,该像素属于矩形,如果像素的中心落在矩形边界的左方或下方时,该像素属于矩形,否则不属于该多边形区域,也就是说,如果象素的中心落在矩形否则不属于该多边形区域,也就是说,如果象素的中心落在矩形边界的右方或上方时,该象素不属于矩形区域。边界的右方或上方时,该象素不属于矩形区域。4.2 多边形扫描转换4.2.1 逐点判断算法n基本思想基本思想:v逐个判断绘图窗口内的像素,确定它们是否在多边形区逐个判断绘图窗口内的像素,确定它们是否在多边形区域内部,从而求出位于多边形区域内的像素的集合。实现域内部,从而求出位于多边形区域内的像素的集合。实现扫描转换多边形最简单方法就是逐点判断。扫描转换多边形最简单方法就是逐点判断。n实质:实质:进行多边形对平面上点的包含性检查进行多边形对平面上点的包含性检查n常用方法常用方法:n射线法射线法n弧长法弧长法4.2.1 逐点判断算法1.1.射线法射线法基本思想:基本思想:v由被测点向某方向作射线,计算此射线与多边形所有边由被测点向某方向作射线,计算此射线与多边形所有边的的交点个数交点个数,用交点分布的,用交点分布的奇偶性奇偶性判别多边形与点的关系。判别多边形与点的关系。判断依据:判断依据:v若交点个数为奇数,则被测点在多边形内部;若交点个若交点个数为奇数,则被测点在多边形内部;若交点个数为偶数(包括数为偶数(包括0 0),则该点在多边形的外部。),则该点在多边形的外部。ACBDabdc4.2.1 逐点判断算法一、射线法一、射线法问题:问题:当射线恰好通过多边形的顶点时,怎么判断当射线恰好通过多边形的顶点时,怎么判断?v 射线射线f f过顶点,若将交点计数为过顶点,若将交点计数为2 2,则则F F点在多边形外。点在多边形外。v 但若规定射线过顶点时,计数为但若规定射线过顶点时,计数为1 1,则则E E在多边形内。在多边形内。efEF12345AB4.2.1 逐点判断算法点点A A:0:0个交点,在多边形外个交点,在多边形外点点B B:1:1个交点,在多边形内个交点,在多边形内点点C C:3 3个交点,在多边形内个交点,在多边形内点点D D:1:1个交点,在多边形内个交点,在多边形内点点E E:2:2个交点,在多边形外个交点,在多边形外点点F F:1:1个交点,在多边形内(剔除重合边)个交点,在多边形内(剔除重合边)f一、射线法一、射线法n措施:措施:v在射线左边的边与该射线相交时交点有效,应计数;而在射在射线左边的边与该射线相交时交点有效,应计数;而在射线右边的边与射线相交时交点无效,不计数。(线右边的边与射线相交时交点无效,不计数。(左闭右开原则左闭右开原则)4.2.1 逐点判断算法二、弧长法二、弧长法n要求要求多边形由有向边组成,即规定沿多边形各边的走向其左侧(或多边形由有向边组成,即规定沿多边形各边的走向其左侧(或右侧)为多边形的内部。右侧)为多边形的内部。n思想思想以被测点为圆心作单位圆,将全部有向边向单位圆作径向投影,以被测点为圆心作单位圆,将全部有向边向单位圆作径向投影,并计算其在单位圆上弧长的代数和。并计算其在单位圆上弧长的代数和。n判断方法判断方法如果代数和为如果代数和为0,则被测点在多边形之外,若代数和为,则被测点在多边形之外,若代数和为2,则,则被测点在多边形之内。被测点在多边形之内。n其他其他对于内部有空洞的多边形,只要按照上述规定来定义多边形的对于内部有空洞的多边形,只要按照上述规定来定义多边形的有向边,则可以采用同样的测试方法。有向边,则可以采用同样的测试方法。4.2.1 逐点判断算法二、弧长法二、弧长法点点P在多边形外部在多边形外部点点P在多边形内部在多边形内部4.2.1 逐点判断算法算法实现:算法实现:v用函数用函数InsideInside(polygonpolygon,x x,y y)来测试被测点()来测试被测点(x x,y y)的)的位置;位置;v函数返回函数返回“真真”值,即可对多边形内部的点进行填充。值,即可对多边形内部的点进行填充。算法特点:算法特点:v简单简单v速度慢速度慢v算法割断了像素间的联系,孤立地考察各个像素与多边形的内算法割断了像素间的联系,孤立地考察各个像素与多边形的内外关系,使得绘图窗口内的每一个像素都要一一判别,每次判外关系,使得绘图窗口内的每一个像素都要一一判别,每次判别又需要大量的运算,所以效率很低。别又需要大量的运算,所以效率很低。4.2.2 扫描线填充算法一、区域特点:一、区域特点:v一条扫描线上的像素存在着相关性一条扫描线上的像素存在着相关性v在多边形边处,像素性质才发生变化在多边形边处,像素性质才发生变化v将相邻像素放在一起测试,从而减少测试点的数目将相邻像素放在一起测试,从而减少测试点的数目4.2.2 扫描线填充算法二、基本思想二、基本思想v按扫描线顺序,先计算出扫描线与多边形区域边界的交点,然后按扫描线顺序,先计算出扫描线与多边形区域边界的交点,然后判断扫描线上的哪些部分在区域边界之内,再用要求的颜色显示边判断扫描线上的哪些部分在区域边界之内,再用要求的颜色显示边界内的像素。界内的像素。实现:实现:v依次考察各条扫描线,一条扫描线从左至右与多边形的交点是成依次考察各条扫描线,一条扫描线从左至右与多边形的交点是成对出现的,即对出现的,即A A、B B点,点,C C、D D点之间的像素都位于多边形之内,则点之间的像素都位于多边形之内,则A A、B B为一个区段,为一个区段,C C、D D为一个区段。对这些区段内的像素用指定的颜为一个区段。对这些区段内的像素用指定的颜色进行填充后,就完成了该扫描线的填充工作,再继续下一条扫描色进行填充后,就完成了该扫描线的填充工作,再继续下一条扫描线。线。4.2.2 扫描线填充算法一般多边形的填充过程,对于一条扫描线,步骤为:一般多边形的填充过程,对于一条扫描线,步骤为:v求交点:求交点:计算扫描线与多边形各边的交点(计算扫描线与多边形各边的交点(A A、D D、C C、B B)v交点排序:交点排序:把所有交点按递增顺序进行排序把所有交点按递增顺序进行排序(A(A、B B、C C、D)D)v交点配对:交点配对:第一个交点与第二个交点,第三个交点与第四个交点等,第一个交点与第二个交点,第三个交点与第四个交点等,每对交点就代表扫描线与多边形的一个相交区间每对交点就代表扫描线与多边形的一个相交区间(A A、B)(CB)(C、D)D)v区间填色:区间填色:把这些相交区间内的象素置成多边形颜色,把相交区间外把这些相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。的象素置成背景色。4.2.2 扫描线填充算法扫描线扫描线2 2 与与P1P1相交,相交,P P1,1,P P1 1,E,E扫描线扫描线7 7 与与P6P6相交,相交,P P6 6,F,G,F,G三、存在问题三、存在问题 交点的个数必须是偶数才能保证填充的正确性。交点的个数必须是偶数才能保证填充的正确性。存在问题:存在问题:当扫描线与多边形的顶点相交时,会出现异常情况。当扫描线与多边形的顶点相交时,会出现异常情况。问题问题1:如何取舍交点,保证交点正确配对?:如何取舍交点,保证交点正确配对?4.2.2 扫描线填充算法v 共享顶点的两条边分别落在扫描线两边,共享顶点的两条边分别落在扫描线两边,取交点取交点1 1次。次。v 共享顶点的两条边均高于扫描线,共享顶点的两条边均高于扫描线,取交点取交点2 2次。次。v 共享顶点的两条边均低于扫描线,共享顶点的两条边均低于扫描线,取交点取交点0 0次。次。解决方法:检查两相邻边在扫描线的哪一侧解决方法:检查两相邻边在扫描线的哪一侧。具体实现:具体实现:只需要检查顶点的两条边的另外两个端点的只需要检查顶点的两条边的另外两个端点的y y值,按这两个值,按这两个y y值值中大于交点中大于交点y y值的个数是值的个数是0 0、1 1、2 2来决定交点是取零个、一个、两个。来决定交点是取零个、一个、两个。4.2.2 扫描线填充算法对左下角为(对左下角为(1 1,1 1),右上),右上角为(角为(3 3,3 3)的正方形填充)的正方形填充存在问题:存在问题:多边形边界上像素的取舍问题。多边形边界上像素的取舍问题。问题问题2:避免填充扩大化?:避免填充扩大化?4.2.2 扫描线填充算法解决方法解决方法:规定落在右:规定落在右/上边界的象素不予填充,而落在左上边界的象素不予填充,而落在左/下下边界的象素予以填充。边界的象素予以填充。具体实现具体实现:对扫描线与多边形的相交区间,对扫描线与多边形的相交区间,取取“左闭右开左闭右开”,如【,如【2 2,9 9)问题问题1 1保证了多边形的保证了多边形的“下闭上开下闭上开”4.2.2 扫描线填充算法 为了求出扫描线与多边形边的交点,最简单的方法是将多边形为了求出扫描线与多边形边的交点,最简单的方法是将多边形的所有边放在一个表中的所有边放在一个表中,称之为称之为边表边表,在处理每条扫描线时,从表,在处理每条扫描线时,从表中顺序取出所有的边,分别求这些边与扫描线的交点。这样做的结中顺序取出所有的边,分别求这些边与扫描线的交点。这样做的结果将做一些无益的求交点动作,因为扫描线并不一定与多边形的边果将做一些无益的求交点动作,因为扫描线并不一定与多边形的边相交,扫描线只与部分甚至较少的边相交;因此,在进行扫描线与相交,扫描线只与部分甚至较少的边相交;因此,在进行扫描线与多边形边求交点时,应只求那些与扫描线相交的边的交点。我们把多边形边求交点时,应只求那些与扫描线相交的边的交点。我们把与当前扫描线相交的边称为与当前扫描线相交的边称为活性边活性边,并把它们按与扫描线交点,并把它们按与扫描线交点 x x 坐标递增的顺序存放在一个链表中,称此链表为坐标递增的顺序存放在一个链表中,称此链表为活性边表活性边表。四、求交点的方法四、求交点的方法4.2.2 扫描线填充算法四、求交点的方法四、求交点的方法1.边表(边表(ET)所以,所以,ETET的意义在于为扫描线提供待加入的新边信息。的意义在于为扫描线提供待加入的新边信息。边的分类表可以这样建立:先按下端点的纵坐标值对所有边作桶分类,再将同一组中的边按下端点X坐标递增的顺序进行排序。1:P2P1P2P32:P1P63:P3P44:5:P5P6P5P4扫描线Y=4.2.2 扫描线填充算法假设当前扫描线与多边形的某一条边的交点坐标为假设当前扫描线与多边形的某一条边的交点坐标为x x,那么下一条,那么下一条扫描线与该边的交点不必从头计算,只要加上一个增量即可。扫描线与该边的交点不必从头计算,只要加上一个增量即可。设边设边ABAB的斜率为的斜率为m m,若其与扫描线,若其与扫描线y yi i的交点横坐标为的交点横坐标为x xi i,则与扫描线,则与扫描线y yi i1 1的交点的横坐标为:的交点的横坐标为:x xi i1 1x xi i1/m1/m2.活性边表活性边表(AET)4.2.2 扫描线填充算法2.活性边表活性边表 活性边表的结点中至少应为对应边保存如下内容:活性边表的结点中至少应为对应边保存如下内容:YmaxYmax:边所交的最高扫描线号;:边所交的最高扫描线号;X X:边与当前扫描线的交点的:边与当前扫描线的交点的X X坐标;坐标;XX:从当前扫描线到下一个扫描线之间的:从当前扫描线到下一个扫描线之间的x x增量;增量;实际上该数据表示了一条扫描线与某条边的交点,将这些交点链接实际上该数据表示了一条扫描线与某条边的交点,将这些交点链接起来,就可以直接得到要求的所有交点。在填充过程中,为每一条起来,就可以直接得到要求的所有交点。在填充过程中,为每一条扫描线建立相应的活性边表,它表示了该扫描线要求交点的那些边,扫描线建立相应的活性边表,它表示了该扫描线要求交点的那些边,在实用中每一条边的活性边表的信息与上一条边的活性边表的信息在实用中每一条边的活性边表的信息与上一条边的活性边表的信息有继承性,再结合有继承性,再结合ETET表使得建立十分方便。表使得建立十分方便。4.2.2 扫描线填充算法4.2.2 扫描线填充算法五五.扫描线算法步骤扫描线算法步骤4.2.2 扫描线填充算法六、扫描线算法特点六、扫描线算法特点1.1.数据结构和算法本身要比逐点判断算法复杂数据结构和算法本身要比逐点判断算法复杂2.2.速度比逐点判断算法快得多速度比逐点判断算法快得多u利用边的连贯性来加速交点的计算u利用AET以排除盲目求交u利用扫描线的连贯性以避免逐点判别4.2.3 边缘填充算法求余运算求余运算:假设假设A A为一个给定的正数,则数为一个给定的正数,则数M M的余数定义为的余数定义为A AM M,记为,记为MM。当计算机内。当计算机内用用n n位二进制表示位二进制表示M M时,可取时,可取A A2 2n n1 1,易知,易知MMM M,即对,即对M M作偶数次求余运作偶数次求余运算,其结果是算,其结果是M M;而对;而对M M作奇数次求余运算的结果是作奇数次求余运算的结果是MM。这一规律应用到多。这一规律应用到多边形的扫描转换,就称为边形的扫描转换,就称为边缘填充算法边缘填充算法。即假设屏幕上某区域内象素的颜色为即假设屏幕上某区域内象素的颜色为M M,则对该区域内象素颜色作偶数次求,则对该区域内象素颜色作偶数次求余运算后,该区域内象素的颜色保持不变,而做奇数次求余运算后,该区域余运算后,该区域内象素的颜色保持不变,而做奇数次求余运算后,该区域内象素的颜色变为内象素的颜色变为MM。4.2.3 边缘填充算法 设设x x1 1,x x2 2,,x,xn n(n n为偶数)是扫描线为偶数)是扫描线y y与多边形的交点的与多边形的交点的x x坐标序列,则该坐标序列,则该扫描线上位于多边形内部的象素可按以下步骤求得:扫描线上位于多边形内部的象素可按以下步骤求得:(1 1)将当前扫描线)将当前扫描线y y上的所有象素都初始化为颜色上的所有象素都初始化为颜色M M:(2 2)在当前扫描线上,从横坐标为)在当前扫描线上,从横坐标为xixi(i i1 1,2 2,n n)的交点向右求余)的交点向右求余 扫描线扫描线y y上位于多边形内部的象素都经过了奇数次求余运算,颜色为上位于多边形内部的象素都经过了奇数次求余运算,颜色为M;M;而而位于多边形外部的象素都经过了偶数次求余运算,颜色为位于多边形外部的象素都经过了偶数次求余运算,颜色为M M。这种多边形的扫描。这种多边形的扫描转换称为以转换称为以扫描线为中心的边缘填充算法扫描线为中心的边缘填充算法边为中心的边缘填充算法:边为中心的边缘填充算法:(1 1)将所有象素都初始化为颜色)将所有象素都初始化为颜色M M(2 2)对于多边形的所有边,逐边向右求余,也就是计算扫描线与边的交点,)对于多边形的所有边,逐边向右求余,也就是计算扫描线与边的交点,从交点开始向右取余从交点开始向右取余4.2.3 边缘填充算法边缘填充算法特点:边缘填充算法特点:l用求余运算代替排序用求余运算代替排序l数据结构和程序结构简单数据结构和程序结构简单l需要对帧缓存的大量象素反复赋值需要对帧缓存的大量象素反复赋值l运行速度比扫描线算法慢运行速度比扫描线算法慢算法过程算法过程4.3 区域填充4.3.1 区域的表示n区域指已经表示成点阵形式的填充图形,它是象素的集合。区域指已经表示成点阵形式的填充图形,它是象素的集合。n区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的整个区域的过程。区域填充算法要求区域是连通的n区域建立和定义的方式:区域建立和定义的方式:n内定义区域:区域内部所有象素具有同一种颜色或亮度值,内定义区域:区域内部所有象素具有同一种颜色或亮度值,而区域外的所有象素具有另一种颜色或亮度值。而区域外的所有象素具有另一种颜色或亮度值。n漫水法:将该区域种的全部象素都设置为新值的算法,即填漫水法:将该区域种的全部象素都设置为新值的算法,即填充内定义的区域充内定义的区域n边界定义区域:边界上所有象素均具有特定的颜色或亮度值,边界定义区域:边界上所有象素均具有特定的颜色或亮度值,而在区域内的象素则具有不是新值的某种颜色或亮度值而在区域内的象素则具有不是新值的某种颜色或亮度值n边界填充算法:将边界定义区域中的全部象素值都设置为新边界填充算法:将边界定义区域中的全部象素值都设置为新值的算法。值的算法。4.3.1 区域的表示 区域填充算法要求区域是连通的,只有在连通的区域中,才有可能将种子点的颜区域填充算法要求区域是连通的,只有在连通的区域中,才有可能将种子点的颜色扩展到区域内的其他点。根据相互连通的定义不同,区域可分为:色扩展到区域内的其他点。根据相互连通的定义不同,区域可分为:n4 4连通:连通:n4 4连通内部表示区域:可以从任一一个象素出发,通过上、下、左、右等连通内部表示区域:可以从任一一个象素出发,通过上、下、左、右等4 4个方向的移动,到达另一个象素。个方向的移动,到达另一个象素。n8 8连通连通n8连通内部表示区域:从任一个象素出发,需要通过水平、垂直、连通内部表示区域:从任一个象素出发,需要通过水平、垂直、对角线等对角线等8种方向的移动,到达另一个象素种方向的移动,到达另一个象素边界定义区域示意图边界定义区域示意图内定义区域示意图内定义区域示意图4.3.2 递归填充算法 1.1.漫水法漫水法基本方法基本方法:设(设(x x,y y)为四连通区域内部的一点,)为四连通区域内部的一点,old_Colorold_Color为区域内部所有象素为区域内部所有象素的原色。现取(的原色。现取(x x,y y)为种子点,要将整个区域填充为新的颜色)为种子点,要将整个区域填充为新的颜色new_Colornew_Color。递归填充算法:递归填充算法:先判别象素(先判别象素(x,yx,y)的颜色,若它的值等于)的颜色,若它的值等于old_Colorold_Color,说明该象素位,说明该象素位于该区域内部,则设置该象素的颜色为于该区域内部,则设置该象素的颜色为new_Colornew_Color,并对与该象素相邻,并对与该象素相邻的上、下、左、右的上、下、左、右4 4个相邻象素作递归填充;否则说明该象素的颜色在个相邻象素作递归填充;否则说明该象素的颜色在区域外或已被填充过,不再进行处理。区域外或已被填充过,不再进行处理。4.3.2 递归填充算法 2.2.边界填充算法边界填充算法与漫水法的基本思想一样,只是在测试与漫水法的基本思想一样,只是在测试(x,y)点的象素是否处在区域之)点的象素是否处在区域之内同时又未被访问过时,包括两部分的内容:内同时又未被访问过时,包括两部分的内容:(1 1)与边界值相比较,以检测此象素是否为该区域的一部分;)与边界值相比较,以检测此象素是否为该区域的一部分;(2 2)与新值相比较,以决定该象素是否已被访问过。)与新值相比较,以决定该象素是否已被访问过。前提条件:前提条件:在初始状态,区域内没有一个象素已设置为新值。但是允许新值等于在初始状态,区域内没有一个象素已设置为新值。但是允许新值等于边界值。边界值。4.3.2 递归填充算法 2 2、边界填充算法、边界填充算法在区域内测试(在区域内测试(x x,y y)点的象素是否在区域之内同时又未被访问过。一般采)点的象素是否在区域之内同时又未被访问过。一般采用堆栈的方法,对边界定义的区域进行填充,基本流程如下:用堆栈的方法,对边界定义的区域进行填充,基本流程如下:种子象素入栈,当栈非空时,执行如下三步操作:种子象素入栈,当栈非空时,执行如下三步操作:(1 1)栈顶象素出栈;)栈顶象素出栈;(2 2)将出栈象素置成多边形色;)将出栈象素置成多边形色;(3 3)按上、下、左、右的顺序检查与出栈象素相邻的四个象素,若其中)按上、下、左、右的顺序检查与出栈象素相邻的四个象素,若其中某个象素不在边界上且未置成多边形色,则把该象素入栈。某个象素不在边界上且未置成多边形色,则把该象素入栈。4.3.2 递归填充算法6754s1932843210 0 1 2 3 4 5例:种子象素为S1s1s172499 94.3.2 递归填充算法6754s132843210 0 1 2 3 4 5例:种子象素为S1s17249 8填充次序:s19 8 2 3 4 5 6 74.3.2 递归填充算法 算法特点:算法特点:(1 1)算法程序简单,表达清楚)算法程序简单,表达清楚(2 2)需要反复递归,其执行效率并不高)需要反复递归,其执行效率并不高(3 3)未考虑象素间的相关性,而是孤立地对一个个象素进行测试)未考虑象素间的相关性,而是孤立地对一个个象素进行测试为了减少递归次数,相继出现改进的算法,最具代表性的是区域填充的为了减少递归次数,相继出现改进的算法,最具代表性的是区域填充的扫描线算法扫描线算法4.3.3 扫描线区域填充算法 利用了象素之间的连贯性,将扫描线上位于区域内部的相邻象素作利用了象素之间的连贯性,将扫描线上位于区域内部的相邻象素作为一个区域来考虑,只选一个象素作为代表进栈,从而极大地减少为一个区域来考虑,只选一个象素作为代表进栈,从而极大地减少了对栈空间的需求,并且显著地提高了执行效率。了对栈空间的需求,并且显著地提高了执行效率。扫描线算法的基本思想扫描线算法的基本思想:首先填充当前扫描线上位于区域内部的一个区段,它的颜色为首先填充当前扫描线上位于区域内部的一个区段,它的颜色为old_Colorold_Color,现在将,现在将fill_Colorfill_Color作为区域填充的新颜色;然后确作为区域填充的新颜色;然后确定与这一区段相邻的上、下两条扫描线上位于区域内部的区段,定与这一区段相邻的上、下两条扫描线上位于区域内部的区段,分别将它们右端象素作为种子点保存起来。反复进行这一过程,分别将它们右端象素作为种子点保存起来。反复进行这一过程,直到保存的区段都填充完毕为止。直到保存的区段都填充完毕为止。4.3.3 扫描线区域填充算法 算法步骤:算法步骤:(1)(1)种子象素压入堆栈种子象素压入堆栈(2)(2)从包含种子象素的堆栈中推出区段的种子象素。从包含种子象素的堆栈中推出区段的种子象素。(3)(3)沿着扫描线,对种子象素的左右象素进行填充,直至遇到边界沿着扫描线,对种子象素的左右象素进行填充,直至遇到边界象素为止;标记区段的左、右端点坐标为象素为止;标记区段的左、右端点坐标为x xl l和和x xr r。(4)(4)在区间在区间xxl l,x xr r 中检查与当前扫描线中检查与当前扫描线y y上、下相邻的两条扫描上、下相邻的两条扫描线上的象素。若存在非边界、未填充的象素,则把每一区间的最线上的象素。若存在非边界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈,返回第(右象素作为种子点压入堆栈,返回第(2 2)步。)步。(5 5)堆栈为空时结束。)堆栈为空时结束。上述算法对于每一个待填充区段,只需压栈一次;因此,扫描线填充上述算法对于每一个待填充区段,只需压栈一次;因此,扫描线填充算法提高了区域填充的效率。算法提高了区域填充的效率。4.3.3 扫描线区域填充算法 上图所示是对四连通边界定义区域进行填充的扫描线算法的执行上图所示是对四连通边界定义区域进行填充的扫描线算法的执行过程,其中过程,其中 表示边界象素。表示边界象素。543214.4 多边形扫描转换与区域填充的区别 二者联系:二者联系:(1 1)都是光栅图形面着色,用于真实感图形显示。可相互转换。都是光栅图形面着色,用于真实感图形显示。可相互转换。(2 2)当已知顶点表示的多边形内一点作为种子点,并用扫描转换)当已知顶点表示的多边形内一点作为种子点,并用扫描转换直线段的算法将多边形的边界表示成八连通区域后,多边形扫描转直线段的算法将多边形的边界表示成八连通区域后,多边形扫描转换问题就可转化为区域填充问题换问题就可转化为区域填充问题(3 3)若已知给定区域是多边形区域,并且通过一定的方法求出它)若已知给定区域是多边形区域,并且通过一定的方法求出它的顶点坐标,则区域填充问题便可以转化为多边形扫描转换问题。的顶点坐标,则区域填充问题便可以转化为多边形扫描转换问题。4.4 多边形扫描转换与区域填充的区别 二者差别:二者差别:(1 1)基本思想不同)基本思想不同多边形扫描转换是指将多边形的顶点表示转换成点阵表示的方法,而多边形扫描转换是指将多边形的顶点表示转换成点阵表示的方法,而区域填充只改编了区域的填充颜色,没有改变区域的表示方法。它们区域填充只改编了区域的填充颜色,没有改变区域的表示方法。它们各自应用的场合不同。各自应用的场合不同。(2)(2)对边界的要求不同对边界的要求不同多边形扫描转换的扫描线算法只要求一条扫描线与多边形边界的交点多边形扫描转换的扫描线算法只要求一条扫描线与多边形边界的交点个数为偶数,所以多边形的边界可以不封闭。而区域填充时,为了防个数为偶数,所以多边形的边界可以不封闭。而区域填充时,为了防止递归填充时跨越区域的边界,要求四连通区域的边界是封闭的八连止递归填充时跨越区域的边界,要求四连通区域的边界是封闭的八连通区域,八连通区域的边界为封闭的四连通区域。通区域,八连通区域的边界为封闭的四连通区域。(3 3)基于的条件不同)基于的条件不同在区域填充算法中,要求给定区域内一点作为种子点,然后从这一点在区域填充算法中,要求给定区域内一点作为种子点,然后从这一点根据连通性将新的颜色扩散到整个区域;而扫描转换多边形是从多边根据连通性将新的颜色扩散到整个区域;而扫描转换多边形是从多边形的边界信息出发,利用多种形式的连贯性进行填充。形的边界信息出发,利用多种形式的连贯性进行填充。4.5 光栅图形的反走样4.5.1 二维光栅图形的走样现象 走样现象:走样现象:(1 1)阶梯状的边界阶梯状的边界:图形信号是连续的,而在光栅系统中,表示:图形信号是连续的,而在光栅系统中,表示图形的象素是离散的,用离散的象素表示连续的线段或多边形的边图形的象素是离散的,用离散的象素表示连续的线段或多边形的边界时就会导致光栅图形走样,即光滑的线段变成了阶梯形状。界时就会导致光栅图形走样,即光滑的线段变成了阶梯形状。(2 2)图形细节失真图形细节失真:由于光栅系统表示图形的最小单位是象素,:由于光栅系统表示图形的最小单位是象素,并且当且仅当象素中心被这些矩形覆盖时象素才被显示。并且当且仅当象素中心被这些矩形覆盖时象素才被显示。细节失真细节失真4.5.1 二维光栅图形的走样现象 走样现象:走样现象:(3 3)狭小图形遗失狭小图形遗失:由于狭小的多边形分布在两条扫描线之间,:由于狭小的多边形分布在两条扫描线之间,它们不覆盖任何一个象素中心,因此,没有被显示出来。它们不覆盖任何一个象素中心,因此,没有被显示出来。狭小矩形遗失狭小矩形遗失4.5.2 反走样方法 为了提高图形的显示质量,需要克服或消除走样现象。常用的反走样为了提高图形的显示质量,需要克服或消除走样现象。常用的反走样方法有:方法有:1.1.提高分辨率的方法提高分辨率的方法可以用提高分辨率的方法来改进线段的外形。可以用提高分辨率的方法来改进线段的外形。提高分辨率前后的比较提高分辨率前后的比较提高显示系统分辨率的方法:提高显示系统分辨率的方法:l增加刷新缓冲器的容量,即将光栅显示器的分辨率提高(代价大)l使用软件来提高分辨率,即用高分辨率计算,用低分辨率显示(代价小)4.5.2 反走样方法 2.2.反走样线段方法反走样线段方法基本思想基本思想:走样是由于在对信号进行数字化处理时,物体上的某坐:走样是由于在对信号进行数字化处理时,物体上的某坐标点的位置是以光栅上的整数象素位置近似表示的。可以通过修改标点的位置是以光栅上的整数象素位置近似表示的。可以通过修改画线算法,增加一个反走样程序以补偿光栅的台阶效应,使所显示画线算法,增加一个反走样程序以补偿光栅的台阶效应,使所显示的线段平顺一些。的线段平顺一些。基本原理基本原理:将位于相邻台阶之间的象素置为过渡颜色或灰度,使得:将位于相邻台阶之间的象素置为过渡颜色或灰度,使得颜色或灰度自然过渡,变化柔和,这样线段看起来就显得平直了,颜色或灰度自然过渡,变化柔和,这样线段看起来就显得平直了,从而可消除台阶效应。从而可消除台阶效应。反走样线段方法反走样线段方法4.5.2 反走样方法 3.3.反走样多边形边界算法反走样多边形边界算法多边形的走样现象主要表现在多边形的边界上,可采用反走样线段的方多边形的走样现象主要表现在多边形的边界上,可采用反走样线段的方法来提高多边形的显示质量。就是根据象素与多边形相交部分的面积来法来提高多边形的显示质量。就是根据象素与多边形相交部分的面积来设置象素的亮度,这样能够明显减少多边形边界上的台阶现象。设置象素的亮度,这样能够明显减少多边形边界上的台阶现象。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!