您好,欢迎访问三七文档
区域填充的算法多边形填充实面积图形填充后的多边形称为实面积图形,实面积图形在其封闭的轮廓内具有相同的颜色,这意味着要填充光栅显示器上封闭图形内的每一个像素点。实面积图形既能描述物体的几何轮廓,又能表现物体的表面颜色,与人们观察物体表面的习惯相一致,同时,实面积图形也是描述三维物体、绘制三维真实感图形的基础。多边形的定义1.凸多边形多边形上任意两顶点间的连线都在多边形之内,凸点对应的内角小于180度,只具有凸点的多边形称为凸多边形。2.凹多边形多边形上任意两顶点间的连线有不在多边形内部的部分,凹点对应的内角大于180度,有凹点的多边形称为凹多边形。环多边形内包含有另外的多边形。如果规定每条有向边的左侧为期内部面积区域,则当观察者沿着边界行走时,内部区域总在其左侧,也就是说多边形外轮廓线的环行方向为逆时针,内轮廓线的环行方向为顺时针。这种定义了环行方向的多边形称为环。多边形的表示1.顶点表示法多边形的顶点表示法是用多边形的顶点序列来描述。特点是直观、占内存少,易于进行几何变换,但由于没有明确指出哪些像素在多边形内,所以不能直接进行填充,需要对多边形进行扫描转换。2.点阵表示法多边形的点阵表示法就是用多边形覆盖的像素点集来描述。特点是便于直接确定实面积图形覆盖的像素点,是多边形填充所需要的表示形式,但是缺少了多边形顶点的几何信息。3.多边形的扫描转换将多边形的描述从顶点表示法变换到点阵表示法的过程,称为多边形的扫描转换。即从多边形的顶点信息出发,求出多边形内部的各个像素点信息。多边形的填充多边形的填充是指从多边形的顶点信息出发,求出其覆盖的每个像素点,置为填充色,而将多边形外部的像素点保留为背景色。多边形填充的主要工作是确定穿越多边形内部的扫描线的覆盖区间。首先确定多边形覆盖的扫描线条数,对每一条扫描线,计算机扫描线与多边形边界交点区间。然后再将该区间内的像素赋予指定的颜色。区域填充区域是指一组相邻而又具有相同忏悔的像素,可以理解为多边形的内部。区域的边界色和填充色不一致,填充算法只对区域内部进行填充。种子填充算法是从给定的种子位置开始,按填充颜色点亮种子的相邻像素考虑到颜色不同的边界像素为止。种子填充算法主要有4邻接点简洁和8邻接点算法。区域填充算法区域填充可以分两步进行,第一步先确定需要填充哪些象素。第二步确定用什么颜色值来填充。1.扫描线多边形域的填充基本原理:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。区间的端点可以通过计算扫描线与多边形的界线的交点获得。一个多边形与若干扫描线y0P4(11,8)P6(2,7)P5(5,5)P1(2,2)P3(11,3)P2(5,1)15105ABCDGEF基本步骤:如图所示,扫描线6与多边形的边界线交于四点A、B、C、D。这四点反扫描线分为五个区间[0,2],[2,3.5],[3.5,7],[7,11],[11,12]。其中,[2,3.5],[7,11]两个区间落在多边形内,该区间内的象素应取多边形色。其它区间背景色。这里的四个交点在计算时未必是按从左到右顺序获得。因此交点序列必需经过排序,才能得到从左到右,按x递增增顺序排列的交点x坐标序列。(1)求交:计算扫描线与多边形各边的交点;(2)排序:把所有交点按递增顺序进行排序;(3)交点配对:第一个与第二个,第三个与第四个等等。每对交点就代表扫描线多边形的一个相交区间;区间填色:把这些相交的区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。当扫描线与多边形顶点相交时,会出现异常情况。扫描线2与P1相交。按前术方法求得交点(x坐标)序列2,2,8。这将导致[2,8]区间内的象素取背景色,而这个区间的象素正是属于多边形内部,需要填充的。所以,我们所考虑当扫描线与多边形的顶点相交时,相同的交点只取一个。这样,扫描线路与多边形边的交点序列就成为2,8。但是,扫描线7与多边形边的交点序列为2,9,11。这将导致错把[2,9]区间作为多边形内部来填充。我们发现当两条边在扫描线的两侧时,交点只取一个。当两条边在扫描线同侧的时侯交点算为0个或2个。一个多边形与若干扫描线0P4(11,8)P6(2,7)P5(5,5)P1(2,2)P3(11,3)P2(5,1)1510ABCDGEF78112.边界上象素的取舍对左下角为(1,1),在上角为(3,3)的正方形填充时,若对边界上所有象素均进行填充,就得到图2-8的的结果。被填充的象素复盖的面积为3X3个单位,而方形的实际面积只有2X2个单位。为了克服这个问题,我们规定落在右/上边界的象素不予填充,而落在左/下边界的象素予以填充。对区域边界上象素全部填充的结果x3213012有效边和有效边表•有效边:多边形内与当前扫描线相交的边称为有效边。在处理一条扫描线时仅对有效边进行求交运算,可以避免与多边形的所有边求交,提高了算法效率。•有效边表:把有效边按照与扫描线交点x坐标递增的顺序存放在一个链表中,称为有效边表(cactiveedgetable,AET)xymax1/knext桶表和边表边表:从有效边表的建立过程可以看出,有效边表缎带出了扫描线和有效边交点坐标的计算机方法,但是没有给出新边出现的位置坐标。为了确定在哪条扫描线上手稿了新边,就需要构造一个边表(edgetable,ET),用以存放扫描线上多边形各条边出现的信息。桶表和边表的表示法1.首先构造一个纵向扫描线链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点称为桶,对应多边覆盖的每一条扫描线。2.将每条边的信息链入与该最小y坐标(ymin)相对应的桶处。3.对于每一条扫描线,如果新增多条边,则按x|ymin坐标递增的顺序存放在一个链表中,若x|ymin相等,则按照1/k由小到大排序,这样就形成了边表。边填充算法基本原理:对于每一条扫描线和每条多边形边的交点(x1,y1),将该扫描线上交点右方的所有象素取补。如图。边填充算法示意图使用栅栏为了减少边填充算法访问象素的次数,可引入栅栏。栅栏指的是一条与扫描线垂直的直线,栅栏位置通常取过多边形顶点、且把多边形分为左右两半。栅栏填充算法的基本思想是:对于每个扫描线与多边形边的交点,就将交点与栅栏之间的象素取补。若交点位于栅栏左边,则将交点置右,栅栏之左的所有象素取补;若交点位于栅栏的右边,则将交点置左,交点之左的象素取补。栅栏填充算法只是减速少了被重复访问的角素的数目,但仍有一些象素会被重复访问。边标志算法边标志算法(轮廓填充算法)可使每个象素访问一次。首先对多边形的每条边进行直线扫描转换,即对多边形边界所经过的像素打上标志;然后对每条与多边形相交的扫描线依次从左到右顺序,逐个访问该扫描线像素,使用一个布尔量inside来指示当前点的状态,inside的初始值为False。每当当前的访问像素为打上边标志的点,就将inside取反,对未打标志的像素,inside不变;对inside作必要操作后,若inside为真,是把该像素量按多边形填充。区域填充算法用点阵方法表示的多边形区域,如果其内部像素具有同一种颜色,而边界像素具有另一种颜色,可以使用种子算法进行填充。四邻接点和八邻接点•四邻接点:对于多边形区域内部任意一个种子像素,其左、上、右、下这4个像素称为四邻接点。•八邻接点:对于多边形区域内部任意一个种子像素,其左、右、上、下以及左上、右上、右下、左下这8个像素称为八邻接点。四连通域和八连通域种子填充算法要求多边形区域内部必须是连通的,才能将种子像素的颜色扩散到多边形区域内部的所有像素点,一般将多边形区域划分为四连通域和八连通域1.可以以4邻接点形式遍历区域内的所有像素点的称4连通域。2.可以以8邻接点形式遍历区域内的所有像素点的称8连通域。邻接点填充算法1.栈顶像素出栈2.按填充色绘制出栈像素。3.左开始沿顺时针方向,若该像素的颜色不是边界色并且未围成填充色,则把该像素入栈;否则丢充该像素扫描线种子填充算法1.栈顶像素出栈2.沿扫描线对出栈像素的左右像素进行填充,直到遇到边界像素为止。同时记录填充该区间,其最左端像记为xl,最右端像素记为xr。
本文标题:CG03区域填充
链接地址:https://www.777doc.com/doc-4029394 .html