您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > ch4多边形扫描&区域填充(3)
2.3多边形的扫描转换与区域填充多边形有两种重要的表示方法:顶点表示和点阵表示。多边形的扫描转换:把多边形的顶点表示转换为点阵表示。区域可采用内点表示和边界表示两种表示形式。区域填充:指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。多边形分为凸多边形、凹多边形、含内环的多边形。2.3.1多边形的扫描转换2.3.1.1扫描线算法基本思想:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。对于一条扫描线填充过程可以分为四个步骤:求交排序配对填色一个多边形与若干扫描线0112233445566778891011P2(5,1)EP3(11,3)DP4(11,8)GFCBP5(5,5)P6(2,7)AP1(2,2)数据结构活性边表(AET):把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中结点内容x:当前扫描线与边的交点坐标△x:从当前扫描线到下一条扫描线间x的增量ymax:该边所交的最高扫描线号ymax2073.5-1.57P6P1P5P6AB7281108P4P5P3P4CD△xymax△xymax△xymax△xymax新边表(NET):存放在该扫描线第一次出现的边。若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中上图所示各条扫描线的新边表NET76P4P5P5P6543210P1P2P2P385-3253320711085285-1.57P6P1P3P4假定当前扫描线与多边形某一条边的交点的x坐标为x,则下一条扫描线与该边的交点不要重计算,只要加一个增量△x。设该边的直线方程为:ax+by+c=0;若y=yi,x=xi;则当y=yi+1时,其中为常数;)(111abxcybaxiiiiabx扫描线与多边形的顶点或边界相交时,必须正确的交点的取舍。只需检查顶点的两条边的另外两个端点的y值。按这两个y值中大于交点y值的个数是0,1,2来决定。123P1P2P3P4算法过程voidpolyfill(polygon,color)intcolor;多边形polygon;{for(各条扫描线i){初始化新边表头指针NET[i];把ymin=i的边放进边表NET[i];}y=最低扫描线号;初始化活性边表AET为空;for(各条扫描线i){把新边表NET[i]中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;遍历AET表,把配对交点区间(左闭右开)上的象素(x,y),用drawpixel(x,y,color)改写象素颜色值;遍历AET表,把ymax=i的结点从AET表中删除,并把ymaxi结点的x值递增x;若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;}}/*polyfill*/2.3.1.2边界标志算法基本思想:帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的象素打上标志。然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着上所需颜色。使用一个布尔量inside来指示当前点是否在多边形内的状态。算法过程voidedgemark_fill(polydef,color)多边形定义polydef;intcolor;{对多边形polydef每条边进行直线扫描转换;inside=FALSE;for(每条与多边形polydef相交的扫描线y)for(扫描线上每个象素x){if(象素x被打上边标志)inside=!(inside);if(inside!=FALSE)drawpixel(x,y,color);elsedrawpixel(x,y,background);}}用软件实现时,扫描线算法与边界标志算法的执行速度几乎相同,但由于边界标志算法不必建立维护边表以及对它进行排序,所以边界标志算法更适合硬件实现,这时它的执行速度比有序边表算法快一至两个数量级。2.3.2区域填充算法区域指已经表示成点阵形式的填充图形,它是象素的集合。区域可采用内点表示和边界表示两种表示形式。区域可分为4向连通区域和8向连通区域。区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的4向连通区域和8向连通区域四个方向运动八个方向运动四连通区域八连通区域表示内点表示边界点2.3.2.1区域填充的递归算法内点表示的4连通区域的递归填充算法:voidFloodFill4(intx,inty,intoldcolor,intnewcolor){if(getpixel(x,y)==oldcolor)//属于区域内点oldcolor{drawpixel(x,y,newcolor);FloodFill4(x,y+1,oldcolor,newcolor);FloodFill4(x,y-1,oldcolor,newcolor);FloodFill4(x-1,y,oldcolor,newcolor);FloodFill4(x+1,y,oldcolor,newcolor);}}边界表示的4连通区域的递归填充算法:voidBoundaryFill4(intx,inty,intboundarycolor,intnewcolor){intcolor;if(color!=newcolor&&color!=boundarycolor){drawpixel(x,y,newcolor);BoundaryFill4(x,y+1,boundarycolor,newcolor);BoundaryFill4(x,y-1,boundarycolor,newcolor);BoundaryFill4(x-1,y,boundarycolor,newcolor);BoundaryFill4(x+1,y,boundarycolor,newcolor);}}2.3.2.2区域填充的扫描线算法算法步骤:首先填充种子点所在扫描线上的位于给定区域的一个区段然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。(1)初始化:堆栈置空。将种子点(x,y)入栈。(2)出栈:若栈空则结束。否则取栈顶元素(x,y),以y作为当前扫描线。(3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xl和xr。(4)并确定新的种子点:在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的象素。若存在非边界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈,返回第(2)步。上述算法对于每一个待填充区段,只需压栈一次;因此,扫描线填充算法提高了区域填充的效率。2.4字符字符指数字、字母、汉字等符号。计算机中字符由一个数字编码唯一标识。国际上最流行的字符集:“美国信息交换用标准代码集”,简称ASCII码。它是用7位二进制数进行编码表示128个字符;包括字母、标点、运算符以及一些特殊符号。汉字编码的国家标准字符集:GB2312-80。该字符集分为94个区,94个位,每个符号由一个区码和一个位码共同标识。区码和位码各用一个字节表示。为了能够区分ASCII码与汉字编码,采用字节的最高位来标识:最高位为0表示ASCII码;最高位为1表示表示汉字编码。字库:为了在显示器等输出设备上输出字符,系统中必须装备有相应的字库。字库中存储了每个字符的形状信息,字库分为矢量型和点阵型两种。点阵字符:每个字符由一个位图表示,该位为1表示字符的笔画经过此位,对应于此位的象素应置为字符颜色。该位为0表示字符的笔画不经过此位,对应于此位的象素应置为背景颜色。点阵字符点阵字库中的位图表示1111110001010101010101010111110001010101010101011111110000000000在实际应用中,有多种字体(如宋体、楷体等),每种字体又有多种大小型号,因此字库的存储空间是很庞大的。解决这个问题一般采用压缩技术。点阵字符的显示分为两步。首先从字库中将它的位图检索出来。然后将检索到的位图写到帧缓冲器中。矢量字符:记录字符的笔画信息,而不是整个位图,具有存储空间小,美观、变换方便等优点。对于字符的旋转、缩放等变换,点阵字符的变换需要对表示字符位图中的每一象素进行;矢量字符的变换只要对其笔画端点进行变换就可以了。矢量字符的显示也分为两步。显示:首先从字库中将它的字符信息。然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符。点阵字符点阵字库中的位图表示矢量轮廓字符1111110001010101010101010111110001010101010101011111110000000000特点:点阵字符:存储量大,易于显示矢量字符:存储量小,美观,变换方便需要光栅化后才能显示。字符属性字体宋体仿宋体楷体黑体隶书字高宋体宋体宋体宋体字宽字倾斜角倾斜倾斜对齐(左对齐、中心对齐、右对齐)字色红色、绿色、蓝色大海大海大海大海字符也是图形方正的启发:符合国情才有生命力。对软件的启发:ISO、CMM?中国特色?(CaPabiltyMaturityModel软件能力成熟度模型)
本文标题:ch4多边形扫描&区域填充(3)
链接地址:https://www.777doc.com/doc-4044571 .html