资源预览内容
第1页 / 共76页
第2页 / 共76页
第3页 / 共76页
第4页 / 共76页
第5页 / 共76页
第6页 / 共76页
第7页 / 共76页
第8页 / 共76页
第9页 / 共76页
第10页 / 共76页
亲,该文档总共76页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第七章光栅图形的扫描转换与区域填色多边形的两种表示方法两种表示方法的优缺点什么是多边形的扫描转换逐点判断算法算法思想:逐个像素判别,检测其是否 在多边形内部,从而给出位于多边形内 部的像素集合。逐点判断算法的具体实现假设P=P0P1P2PnP0为一个给定多边形 ,P0,P1,P2Pn为其顶点表示。假设inside(P,x,y)是验证点(x,y)是否在多 边形P内的布尔函数。Inside函数的实现原理计算从(x,y)到(+,y)的射线与多边形的交 点个数。若交点个数是奇数的话,就表明该点在 多边形内部,否则该点在多边形外部。逐点判断算法的具体实现假设framebuffer(x,y)是与(x,y)对应的帧 缓冲器中的元素,用以存放对应像素的 颜色值。设polygon_color为多边形内的 颜色值,background_color为背景颜色 。逐点判断算法的伪代码程序for y:=screen_ymin to screen_ymax do for x:=screen_xmin to screen_xmax do if inside(P,x+0.5,y+0.5) then setpixel(framebuffer,x,y,polygon_color) else setpixel(framebuffer,x,y,background_co lor)逐点判断算法的优缺点优点:简单,易于理解。缺点:忽略了像素与像素之间的联系, 如果整个平面有几千万个像素,也要一 一进行判别,要做大量的计算工作,效 率太低。扫描线算法扫描线算法利用了相邻像素之间的连贯 性,避免了反复求交的运算。扫描线算法综合利用了区域的连贯性, 扫描线的连贯性和边的连贯性。区域的连贯性假设多边形P的顶点Pi(xi,yi),i=0,1,2n各个顶点Pi的纵坐标按yi递减排序: yi0, yi1, yi2 yin 其中yi,k= yi,k+1区域的分割现在作两条扫描线y=yi,k和y=yi,k+1,这 两条扫描线之间的区域被多边形分割成 若干个梯形。梯形上下两底分别为两条扫描线,腰在 多边形P的边上或在显示屏幕的边界上 。分割后区域的分类这些梯形分为两类:在多边形P内部和在 多边形P外部。两类梯形交替地排列在长方形区域内。如果知道了某点q所在区域在多边形内( 或外),就能知道整个长方形区域内的梯 形排列情况。此性质称为区域的连贯性。扫描线的连贯性假设e为一整数满足 若扫描 线y=e与多边形P的边Pi-1Pi相交,则记 其交点的横坐标xei。现在假设xei1,xei2,xeil为扫描线与P的 边界各交点的横坐标的递增序列,称为 交点序列。交点序列的性质l是偶数。在该扫描线上只有区段(xeik,xei,k+1), (k=1,3,5l-1)位于多边形P内,其余均在 多边形P外,两种区段沿扫描线相间排列 。此性质称为扫描线的连贯性。交点序列若d=e-1,则位于扫描线y=d上的交点序 列为xdj1,xdj2,xdjk。若多边形P的边Pr-1Pr与扫描线y=e和 y=d都相交,则xer和xdr满足:怎样得到y=e上的交点序列通过递推式可以算出与y=e和y=d都相交 的点若再求出与扫描线y=d不相交但与下一扫 描线y=e相交的所有边PqPq+1上的交点xeq然后把这些点按底层的顺序排列,就能 得到了y=e上的交点序列边的连贯性当取某一整数k,00不是极值点的顶点称为非极值点。对于奇点的两种情况的处理扫描线算法的数据结构边的分类表ET边的分类表ET是按边下端点的纵坐标y 对非水平边进行分类的链表数组。边的活化表AEL边的活化表AEL由与当前扫描线相交的 所有多边形的边组成,它记录了多边形 边沿扫描线的交点序列,并根据递推式 :不断刷新交点序列。扫描线算法的描述步骤1:(y初始化)建立ET表,并且取扫 描线纵坐标y的初始值为ET中非空元素的 最小序列。步骤2:(AEL初始化)将边的活化链表 AEL设置为空。步骤3:按从下到上的顺序对纵坐标值为 y的扫描线(当前扫描线)执行子算法,直 到ET和AEL都变为空为止。子算法步骤1)如果边分类表ET中第y类元素为非空, 则将属于该类的所有边从ET中取出并插 入边的活化链表AEL中,AEL中各边按x的 值(当x的值相等时,按x值)递增方式 排序。子算法步骤2)若相对于当前扫描线,边的活化链表 AEL非空,则将AEL中边两两依次配对 ( 位置位于1,2的配对;位置位于3,4的配 对),依次配对的边的内部点(像素)按多 边形的颜色属性进行着色。子算法步骤3)将边的活化链表AEL中ymaxy的边删去4)将边的活化链表AEL剩下的每一条边的 x域累加x,即x:=x+x5)将当前扫描线的纵坐标值y累加1,即 y:=y+1扫描线算法的优缺点优点:效率高。缺点:程序复杂,需要排序。边缘填充算法由于扫描线算法需要对多边形的边进行 排序,如果采用求余的方法,就不用对 边进行排序了。什么是求余?数学上:A为一个给定的正数,数M的 余是指A-M的差。记为 ,易得光栅图形上:若某区域已着上值为M的 某种颜色,对M作偶数次求余运算后, 此区域颜色不变,作奇数次求余运算后 ,区域颜色变为 。求余运算的函数表示Complement(framebuffer,x,y)为实施求 余运算的函数,其作用为framebuffer(x,y):=A-framebuffer(x,y)边缘填充算法的描述假设x1,x2,xm为扫描线与多边形P的交 点的数列(不要求是递增序列)。步骤1:在y=e上所有像素都上值为 的颜 色:for x:=screen_xmin to screen_xmax do setpixel(framebuffer,x,e,M)边缘填充算法的描述步骤2:对位于扫描线y=e上的所有x坐 标大于xi(I=1,2,m)的像素求余。称 为向右求余:for i:=1 to m do for x:=xi to screen_xmax do Complement(framebuffer,x,y)这样,多边形内被着色M,多边形外被 着色 。边缘填充算法的图示边缘填充算法的边界求余边缘填充算法的优缺点优点:数据结构和程序都比较简单。缺点:需对帧缓冲器中大批元素反复赋 值,速度并不比扫描线算法快。边界标志算法边界标志算法采用先画边界后填色的方 法,对帧缓冲器中每个元素赋值不超过2 次。边界标志算法的算法思想算法思想:先把多边形边界用另一种颜 色标识出来,由于边界已经标识出来了 ,边界之间的各个区段要么填上多边形 内部的颜色,要么填上背景色。步骤1:以值为boundary_color的特殊颜 色勾画多边形P的边界。见书上的程序。步骤2:逐条扫描线对多边形着色。因为 已经标志为特殊颜色的边界是两两配对 的。一对边界点中间可能是多边形区域 内的点,也可能是多边形区域外的点。边界标志算法的描述如何判断边对中间的点是否在 多边形内部采用一个布尔变量interior_point,如 果当前像素位于多边形内,则为true, 应着polygon_color,否则为false,应 着background_color。interior_point如何变化此布尔变量起始在多边形外,初始值为 false,每碰到一个边界像素,就取反。边界标志算法的优缺点优点:避免了对帧缓冲器中大量元素的 多次赋值,速度与扫描线算法相当。缺点:需逐条扫描线对帧缓冲器中的元 素进行搜索和比较。区域填充区域填充是指先将区域内一点赋予给定 颜色,然后将这种颜色扩展到整个区域的 过程。最先的那点也叫做种子点。区域的表示法内点表示法:把所给区域内所有象素一一 列举出来。边界表示法:把所给区域边界上的象素一 一列举出来。区域的连通性在区域填充算法中要求区域具有一定的 连通性。4连通性4连通:区域任意两点,从一点出发通过 上、下、左、右方向,只经过区域内的 点可到达另一点。8连通性8连通:区域任意两点,从一点出发通过 水平、垂直和对角线方向,只经过区域 内的点可到达另一点。具体表现形式内点表示的4连通区域边界表示的4连通区域内点表示的8连通区域边界表示的8连通区域两种连通性的边界不同同一个区域可以看成是4连通区域,也可 以看成是8连通区域,但是两者的边界是 不同的。4连通区域的边界是8连通区域; 8连通 区域的边界是4连通区域。递归算法算法思想:先选取一个种子象素(x,y), 然后设此象素(x,y)为new_color,然后逐 步按照连通性进行递归调用将整个区域G 都设置为new_color。递归算法的算法步骤先测试象素(x,y)的颜色是否等于old_color ,若不是则说明该象素在区域G外,不能 取为种子,停止填充;否则置该象素颜色为new_color,再对上 、下、左、右四个象素递归调用本身函数 。算法程序(内点表示的4连通)Procedure flood-fill- 4(x,y,old_color,new_color:integer)Begin if getpixel(framebuffer,x,y)=old_color then begin setpixel(framebuffer,x,y,new_color) flood-fill-4(x,y+1,old_color,new_color) flood-fill-4(x,y-1,old_color,new_color) flood-fill-4(x-1,y,old_color,new_color) flood-fill-4(x+1,y,old_color,new_color) endend递归算法的特点递归这种方法必须包含两个部分:自身 调用和停止条件。其他形式的区域表示如何变动若是边界表示的4连通区域的程序只要改 动判断条件就行了。if getpixel(framebuffer,x,y)new_color递归算法的优缺点和作业优点:程序简单明了。缺点:数据和函数反复进出系统堆栈,费 时费内存。作业:内点表示的8连通区域、边界表示 的8连通区域的递归算法的程序。扫描线算法区域填充的扫描线算法适用于边界表示 的4连通区域。扫描线算法的算法思想首先填充种子点所在的当前扫描线上位 于给定区域内的一区段。然后确定与这一区段相邻的上下两条扫 描线上位于区域内的区段,并依次把这 些区段的右端点入栈。然后不断取出栈顶的种子重复继续上一 过程,直到栈空。算法的实现(1)1)初始化:将种子点压入初始化后的栈。2)出栈:如果栈为空,算法结束;否则取 栈顶元素为当前种子点。3)区段填充:从当前种子点开始沿水平扫 描线向左右两个方向逐个像素进行填色, 直至抵达边界为止。4)定范围:以XLEFT和XRIGHT分别表示第 三步中填充的区段两个端点的横坐标。算法的实现(2)5)进栈:分别在于当前扫描线相邻的上 下两条扫描线上,确定位于区间【 XLEFT,XRIGHT】内的给定区域的区段。 如果这些区段内的像素颜色值为内部点 或边界点的颜色的话,则转到第二步, 否则从XLEFT开始向右逐点判断,直到碰 到边界点停下,此时把边界点左端的点 (区段右端点)入栈。向右继续逐点判 断是否还存在空白区段,如果有,把这 些区段的右端点依次入栈。实例算法的优点和缺点优点:只需把扫描线右端种子入栈,而 无须把全部象素入栈,进出栈次数大为 减少,内存节省很多,速度提高很快。缺点:对于已经填充的直线可能会
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号