第3章 基本图形元素生成算法精选PPT.ppt
《第3章 基本图形元素生成算法精选PPT.ppt》由会员分享,可在线阅读,更多相关《第3章 基本图形元素生成算法精选PPT.ppt(162页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第3章章 基本图形元素基本图形元素生成算法生成算法第1页,本讲稿共162页3.1 直线的扫描转换直线的扫描转换 3.1.1DDA算法DDA算法是根据直线的微分方程来计算x或y生成直线的扫描转换算法。在一个坐标轴上以单位间隔对线段取样,以决定另一个坐标轴方向上最靠近理想线段的整数值。第2页,本讲稿共162页设(x0,y0)为直线段的始点,(x1,y1)为直线段的终点,且端点坐标均为整数,则直线的微分方程为设|k|1,则有 yi+1=kxi+1+b=k(xi+x)+b=yi+kx上式表明,若x=1,则当x每递增1时,y递增k。扫描转换开始时,取直线始点(x0,y0)作为初始坐标。算法描述如下:k
2、为直线的斜率第3页,本讲稿共162页voidDDA-line(x0,y0,x1,y1,color)intx0,y0,x1,y1,color;intx;floaty,k,deltx,delty;deltx=x1-x0;delty=y1-y0;k=deltydeltx;y=y0;for(x=x0;x=x1;x+)putpixel(x,int(y+0.5),color);y=y+k;第4页,本讲稿共162页3.1.2中点画线法为了讨论的方便,假定直线的斜率在01之间,其它情况参照下述讨论进行处理。假设直线的起点和终点分别为(x0,y0)和(x1,y1),则直线方程为F(x,y)=ax+by+c=0第
3、5页,本讲稿共162页其中,a=y0-y1,b=x1-x0,c=x0y1-x1y0。对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)0;而对于直线下方的点,F(x,y)0。如图3.1所示,若直线在x方向上增加一个单位,则在y方向上的增量只能在0和1之间。假设横坐标为xP的各像素点中最佳逼近于理想直线的像素为(xP,yP),用实心小圆表示。那么,下一个与直线最近的像素只能是正右方的P1(xP+1,yP)或右上方的P2(xP+1,yP+1)两者之一,用空心小圆表示。我们用P1和P2的中点M(xP+1,yP+0.5)与理想直线的位置关系来判定。第6页,本讲稿共162页图3.1中点画线
4、示意图第7页,本讲稿共162页设Q是理想直线与垂直线x=xP+1的交点。若M在Q的下方,则P2离理想直线近,应取为下一个像素;否则应取P1。为此,我们构造判别式d=F(M)=F(xP+1,yP+0.5)=a(xP+1)+b(yP+0.5)+c当d0时,M在直线上方,则应取正右方的P1;当d=0时,约定取正右方的P1。第8页,本讲稿共162页下面我们讨论如何计算判别式d。由于d是xP和yP的线性函数,因而可以采用增量方法计算,以提高运算效率。当d0时,取正右方像素P1,再下一个像素应在P1的正右方像素P3(xP+2,yP)和P1的右上方像素P4(xP+2,yP+1)中选取,应计算d1=F(xP+
5、2,yP+0.5)=a(xP+2)+b(yP+0.5)+c=d+a第9页,本讲稿共162页故在d0的情况下,d的增量为a。而若d0,则取右上方像素P2,再下一个像素应在P2的正右方像素P4(xP+2,yP+1)和P2的右上方像素P5(xP+2,yP+2)中选取,应计算d1=F(xP+2,yP+1.5)=a(xP+2)+b(yP+1.5)+c=d+a+b故在d0的情况下,d的增量为a+b。第10页,本讲稿共162页再讨论d的初始值。第一个像素应取左端点(x0,y0),相应的判别式为d0=F(x0+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c=ax0+by0+c+a+0.5b=F(x
6、0,y0)+a+0.5b d的初始值为:a+0.5b第11页,本讲稿共162页中点画线法的伪C算法描述如下:voidMidPoint-Line(x0,y0,x1,y1,color)intx0,y0,x1,y1,color;inta,b,delta1,delta2,d,x,y;a=y0-y1;b=x1-x0;d=2*a+bdelta1=2*a;delta2=2*(a+b);x=x0;y=y0;第12页,本讲稿共162页putpixel(x,y,color);while(xx1)if(d0)x+;y+;d+=delta2;elsex+;d+=delta1;putpixel(x,y,color);第
7、13页,本讲稿共162页3.1.3Bresenham算法Bresenham画线算法与中点画线法有相似之处,也是通过在每列像素中确定与理想直线最近的像素来进行直线的扫描转换的。为了讨论的方便,不妨也假定直线的斜率在01之间。如图3.2所示,过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与该交点最近的像素。第14页,本讲稿共162页图3.2Bresenham算法误差项d的几何意义第15页,本讲稿共162页算法的伪C描述如下:voidBresenham-Line(x0,y0,x1,y1,color)intx0,y0,x1,y1,col
8、or;intx,y,dx,dy;floatk,e;dx=x1-x0;dy=y1-y0;k=dy/dx;e=-0.5;x=x0;y=y0;第16页,本讲稿共162页for(i=0;i=0)y=y+1;e=e-1;第17页,本讲稿共162页上述算法在计算直线的斜率与误差项时,要用到小数和除法,不便于硬件实现。由于算法中只用到误差项的符号,因此,为了避免除法,令e=2edx,用e代替e。改进之后的算法如下:第18页,本讲稿共162页voidBresenham-Line(x0,y0,x1,y1,color)intx0,y0,x1,y1,color;intx,y,dx,dy,e;dx=x1-x0;dy=
9、y1-y0;e=-dx;x=x0;y=y0;for(i=0;i=0)第19页,本讲稿共162页y=y+1;e=e-2*dx;第20页,本讲稿共162页3.2 圆和椭圆的扫描转换圆和椭圆的扫描转换3.2.1圆的扫描转换1.中点画圆法为了讨论的方便,我们考虑中心在原点,半径为R的圆的第二个八分圆弧,圆的其它部分可通过一系列的简单的反射变换得到。也就是讨论如何从(0,R)到(R/,R/)顺时针确定最佳逼近于该圆弧的像素序列。第21页,本讲稿共162页中心在原点,半径为R的圆的方程为x2+y2=R2若令F(x,y)=x2+y2-R2,则上述方程为 F(x,y)=0第22页,本讲稿共162页如图3.3所
10、示,假定x坐标为xP的像素中最佳逼近理想圆弧的为P(xP,yP),那么,下一个像素只能是正右方的P1(xP+1,yP)或右下方的P2(xP+1,yP-1)两者之一。引入P1和P2的中点M(xP+1,yP-0.5),当M在圆内时,应取P1(xP+1,yP)为下一个像素,否则,应取P2(xP+1,yP-1)为下一个像素。为此,构造判别式d=F(M)=F(xP+1,yP-0.5)=(xP+1)2+(yP-0.5)2-R2第23页,本讲稿共162页图3.3中点画圆法第24页,本讲稿共162页若d0,则应取P1(xP+1,yP)为下一个像素,而且再下一个像素的判别式为d=F(xP+2,yP-0.5)=(
11、xP+2)2+(yP-0.5)2-R2=d+2xP+3而d0,则应取P2(xP+1,yP-1)为下一个像素,而且再下一个像素的判别式为d=F(xP+2,yP-1.5)=(xP+2)2+(yP-1.5)2-R2=d+2(xP-yP)+5由于第一个像素是(0,R),因而d的初始值为d0=F(1,R-0.5)=1.25-R第25页,本讲稿共162页根据以上分析,可得中点画圆法算法如下:voidMidPoint-Circle(r,color)intr,clor;intx,y;floatd;x=0;y=r;d=1.25-r;putpixel(x,y,color);while(xy)if(d0)d+=2*
12、x+3;x+;第26页,本讲稿共162页elsed+=2*(x-y)+5;x+;y-;putpixel(x,y,color);第27页,本讲稿共162页在上述的算法中,判别式d使用了浮点数,影响了算法的效率。为了摆脱浮点数,令e=d-0.25,则e的初始值为1-r。判别式d0对应于e-0.25。而e的初始值为整数,且在运算过程中的增量也是整数,故e始终是整数,因而e-0.25等价于e0。改进之后的算法为第28页,本讲稿共162页voidMidPoint-Circle(r,color)intr,clor;intx,y,e;x=0;y=r;e=1-r;putpixel(x,y,clolor);wh
13、ile(xy)if(e0)e+=2*x+3;x+;第29页,本讲稿共162页elsee+=2*(x-y)+5;x+;y-;putpixel(x,y,clolor);第30页,本讲稿共162页上述算法中,e的增量是x,y的线性函数。每当x递增1,e递增2;每当y递减1,e递增2。由于初始像素为(0,r),所以x可以看成从3开始递增,y可看成从2r+2开始递减。因而上述算法可改进为第31页,本讲稿共162页voidMidPoint-Circle(r,color)intr,clor;intx,y,deltax,deltay,e;x=0;y=r;e=1-r;deltax=3;deltay=2-r-r;
14、putpixel(x,y,color);while(xy)if(e0,这时,右下方像素D在圆外,圆弧与候选点的关系只可能是和的情形,最佳逼近圆弧的像素只可能是D与V二者之一。为了确定D和V哪个更接近于圆弧,令DV=|D|-|V|=|(x+1)2+(y-1)2-R2|-|x2+(y-1)2-R2|第38页,本讲稿共162页若DV0,应取正下方像素V。而当DV=0时,二者均可取,约定取右下方像素D。对于情形,由于右下方像素D在圆外,而正下方像素V在圆内,所以D0,V0,因此DV=D+V=(x+1)2+(y-1)2-R2+x2+(y-1)2-R2=2D-2x-1第39页,本讲稿共162页故可根据2D
15、-2x-1的符号,在情形判断应取D或V。对于情形,D和V都在圆外,应取V为下一像素。由于这时D0且V0,因此2D-2x-1=D+V0可见,在D0的情况下,若2D-2x-10,应取D为下一像素,否则取V作为下一像素。第40页,本讲稿共162页如果D0,这时,右下方像素D在圆内,圆弧与候选点的关系只可能是和的情形。这时最佳逼近圆弧的像素只可能是H或D之一。同样可令HD=|H|-|D|=|(x+1)2+y2-R2|-|(x+1)2+(y-1)2-R2|若HD0,则D到圆的距离小于H到圆的距离,这时应取D为下一个像素。而当HD=0时,二者均可,约定取正右方像素H。第41页,本讲稿共162页对于情形,H
16、总在圆外,D在圆内,因而有H0,D0,所以HD=H+D=(x+1)2+y2-R2+(x+1)2+(y-1)2-R2=2D+2y-1故可根据2D+2y-1的符号,在情形判断应取H或D。第42页,本讲稿共162页而对于情形。这时,H、D都在圆内,而在这段圆弧上,y是x的单调递减函数,所以只能取H为下一个像素。又H0且D0,因此,2D+2y-1=H+D0与情形的判别条件一致。可见在D=0)putpixel(x,y,color);if(delta0)delta1=2*(delta+y)-1;if(delta10)delta2=2*(delta-x)-1;if(delta2=0)direction=2;
17、elsedirecion=3;elsedirection=2;switch(direction)case1:x+;delta+=2*x+1;break;第48页,本讲稿共162页case2:x+;y-;delta+=2*(x-y+1)break;case3:y-;delta+=(-2*y+1);break;第49页,本讲稿共162页3.2.2椭圆的扫描转换中点画圆法可以推广到一般二次曲线的生成,下面以中心在原点的标准椭圆的扫描转换为例说明。设椭圆的方程为F(x,y)=b2x2+a2y2-a2b2=0其中,a为沿x轴方向的长半轴长度,b为y轴方向的短半轴长度,a、b均为整数。不失一般性,我们只讨
18、论第一象限椭圆弧的生成。需要注意的是,在处理这段椭圆时,必须以弧上斜率为-1的点(即法向量两个分量相等的点)作为分界把它分为上部分和下部分,如图3.6所示。第50页,本讲稿共162页图3.6第一象限的椭圆弧第51页,本讲稿共162页该椭圆上一点(x,y)处的法向量为第52页,本讲稿共162页其中,i和j分别为沿x轴和y轴方向的单位向量。从图3.6可看出,在上部分,法向量的y分量更大,而在下部分,法向量的x分量更大,因而,在上部分若当前最佳逼近理想椭圆弧的像素(xP,yP)满足下列不等式b2(xP+1)a2(yP-0.5)而确定的下一个像素不满足上述不等式,则表明椭圆弧从上部分转入下部分。第53
19、页,本讲稿共162页在上部分,假设横坐标为xP的像素中与椭圆弧更接近点是(xP,yP),那么下一对候选像素的中点是(xP+1,yP-0.5)。因此判别式为d1=F(xP+1,yP-0.5)=b2(xP+1)2+a2(yP-0.5)2-a2b2若d10,中点在椭圆内,则应取正右方像素,且判别式应更新为d1=F(xP+2,yP-0.5)=b2(xP+2)2+a2(yP-0.5)2-a2b2=d1+b2(2xP+3)第54页,本讲稿共162页当d10,中点在椭圆之外,这时应取右下方像素,并且更新判别式为d1=F(xP+2,yP-1.5)=b2(xP+2)2+a2(yP-1.5)2-a2b2=d1+b
20、2(2xP+3)+a2(-2yP+2)由于弧起点为(0,b),因此,第一中点是(1,b-0.5),对应的判别式是d10=F(1,b-0.5)=b2+a2(b-0.5)2-a2b2=b2+a2(-b+0.25)第55页,本讲稿共162页在下部分,应改为从正下方和右下方两个像素中选择下一像素。如果在上部分所选择的最后一像素是(xP,yP),则下部分的中点判别式d2的初始值为d20=F(xP+0.5,yP-1)=b2(xP+0.5)2+a2(yP-1)2-a2b2d2在正下方向与右下方向的增量计算与上部分类似,这里不再赘述。下部分弧的终止条件是y=0。第56页,本讲稿共162页第一象限椭圆弧的扫描转
21、换中点算法的伪C描述如下:voidMidpointEllipse(a,b,color)inta,b,color;intx,y;floatd1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);putpixel(x,y,color);while(b*b*(x+1)a*a(y-0.5)if(d10)if(d20)d2+=b*b(2*x+2)+a*a*(-2*y+3);x+;y-;elsed2+=a*a*(-2*y+3);第58页,本讲稿共162页y-;putpixel(x,y,color);第59页,本讲稿共162页3.3 区区 域域 填填 充充 3.3.1多边形区域填充这里所讨论的
22、多边形域可以是凸的、凹的,还可以是带孔的。该算法的基本原理是按扫描线顺序,对每一条扫描线执行如下四步:第60页,本讲稿共162页(1)求扫描线与多边形各边的交点;(2)将求得的交点按递增顺序进行排序;(3)交点配对,确定相交区间;(4)将相交区间内的像素置成多边形色,相交区间外的像素置成背景色。第61页,本讲稿共162页图3.7多边形域的填充第62页,本讲稿共162页如图3.7所示,扫描线6与多边形的边界线交于四点A、B、C、D,得到的各交点的横坐标分别为2、4、8、11,按递增顺序排序后仍为2、4、8、11,相交区间为2,4、8,11,这两个区间的像素置成多边形色,把相交区间外的像素置成背景
23、色。第63页,本讲稿共162页图3.8对区域边界上像素全部填充的结果第64页,本讲稿共162页下面再进一步讨论填充算法实现问题。该算法关键在于计算每条扫描线与多边形各边的交点,直接用直线方程求交点的方法效率较低,是不可取的。为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。把与当前扫描线相交的边称为活性边,可以为每一条扫描线建立活性边表,以存放与该扫描线相交的边的有关信息,如扫描线与该边的交点x等。第65页,本讲稿共162页由于边的连贯性(即当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交),以及扫描线的连贯性(即当前扫描线和各边的交点顺序与下一条扫描线和各边的交
24、点顺序很可能相同或非常类似),我们根据当前扫描线的活性边表来导出下一条扫描线的活性边表,不必为下一条扫描线从头开始构造活性边表。设边的直线方程为ax+by+c=0若y=yi时,x=xi,则当y=yi+1时第66页,本讲稿共162页令x=-b/a,上式表明某一条边与当前扫描线相交,交点x坐标为xi,如果它与下一条扫描线相交,交点x坐标为xi+1,则xi+1=xi+x。此外,如果它与下一条扫描线不相交,那么要及时把它从活性边表中删除出去,避免下一步进行无谓的计算。因而活性边表的结点中至少应为对应边保存如下内容:x:当前扫描线与边的交点;x:从当前扫描线到下一条扫描线之间的x增量;ymax:边所交的
25、最高扫描线号。第67页,本讲稿共162页图3.9图3.7中扫描线6和扫描线7的活性边表(a)扫描线6的活性边表;(b)扫描线7的活性边表(a)(b)第68页,本讲稿共162页图3.10图3.7中各扫描线的新边表第69页,本讲稿共162页3.3.2边填充算法 图3.11(a)所示为对图中的多边形的各边打上了边标志,图3.11(b)所示为扫描线4填充前和填充后的各像素,填黑色者表示置为多边形色。边填充算法的伪C算法如下:第70页,本讲稿共162页defineFALSE0edge-mark-fill(polydef,color)多边形定义polydef;intcolor;对多边形polydef每条边
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 基本图形元素生成算法精选PPT 基本 图形 元素 生成 算法 精选 PPT
限制150内