计算机图形学ppt课件第二章基本图形的生成与计算.ppt
《计算机图形学ppt课件第二章基本图形的生成与计算.ppt》由会员分享,可在线阅读,更多相关《计算机图形学ppt课件第二章基本图形的生成与计算.ppt(100页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章基本图形的生成与计算图形的扫描转换(光栅化):确定一个像素集合,用于显示一个图形的过程。步骤如下:1、确定有关像素2、用图形的颜色或其它属性,对像素进行写操作。对一维图形,不考虑线宽,则用一个像素宽的直线来显示图形。二维图形的光栅化,即区域的填充:确定像素集,填色或图案。任何图形的光栅化,必须显示在一个窗口内,否则不予显示。即确定一个图形的哪些部分在窗口内,哪些在窗口外,即裁剪。图形显示前需要:扫描转换+裁剪裁剪-扫描转换:最常用,节约计算时间。扫描转换-裁剪:算法简单;2.1 直线的生成算法直线的扫描转换直线的扫描转换:确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写
2、操作。三个常用算法:数值微分法(DDA)中点画线法Bresenham算法。直线DDA算法设直线起点为(x1,y1),终点(x2,y2),则斜率m为这种方法直观,但效率太低,因为每一步需要一次浮点乘法和一次舍入运算。增量算法:在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得,则称为增量算法。DDA算法就是一个增量算法。计算yi+1=mxi+1+b =mxi+b+kx =yi+mx 当x=1;yi+1=yi+m 即:当x每递增1,y递增m(即直线斜率);注意上述分析的算法仅适用于m 1的情形。在这种情况下,x每增加1,y最多增加1。当 m 1时,必须把x,y地位互换1a1b2
3、b2a3a3b4b4a(x1,y1)(x2,y2)直线从(x1,y1)到(x2,y2)的方向不同,分为8个极限。方向在第1a象限内的直线,取增量Dx=1,Dy=m;在1b象限内的,取增量Dy=1,Dx=1/m。象限象限|dx|dy|?|dx|dy|?DxDxDyDy象限象限|dx|dy|dx|dy|?DxDxDyDy1a1aTrueTrue1 1mm3a3aTrueTrue-1-1-m-m1b1bFalseFalse1/m1/m1 13b3bFalseFalse-1/m-1/m-1-12a2aTureTure-1-1mm4a4aTureTure1 1-m-m2b2bFalseFalse-1/m
4、-1/m1 14b4bFalseFalse1/m1/m-1-1表.1研究表.1的数据,可以得到如下规律:1、当|dx|dy|时|Dx|=1,|Dy|=m否则|Dx|=1/m,|Dy|=12、Dx,Dy的符号与dx,dy的符号相同依据上述规律可以生成直线,每生成一条直线做两次除法,画线中的每点做两次加法,所以DDA算法生成直线的速度还是很快的。void DDALine(int x0,int y0,int x1,int y1,int color)int x;float dx,dy,y,k;dx=x1-x0;dy=y1-y0;k=dy/dx;y=y0;for(x=x0;xx1,x+)drawpixe
5、l(x,int(y+0.5),color);y=y+k;n n例:画直线段P0 0(0,0)-P1 1(5,2)x int(y+0.5)x int(y+0.5)y+0.5y+0.50 00 00+0.50+0.51 10 00.4+0.50.4+0.52 21 10.8+0.50.8+0.53 31 11.2+0.51.2+0.54 42 21.6+0.51.6+0.55 52 22.0+0.52.0+0.5缺点:在此算法中,y、k必须是float,且每一步都必须对y进行舍入取整,不利于硬件实现。直线中点画线法当当MM在在QQ的下方的下方-P-P2 2离直线更近更近离直线更近更近-取取P P2
6、 2。MM在在QQ的上方的上方-P-P1 1离直线更近更近离直线更近更近-取取P P1 1MM与与QQ重合,重合,P P1 1、P P2 2任取一点。任取一点。问题:如何判断问题:如何判断MM与与QQ点的关系?点的关系?直线中点画线法假设直线方程为:ax+by+c=0其中a=y0-y1,b=x1-x0,c=x0y1-x1y0由常识知:欲判断M点是在Q点上方还是在Q点下方,只需把M代入F(x,y),并检查它的符号。直线中点画线法构造判别式:构造判别式:d=F(M)=F(xd=F(M)=F(xp p+1,y+1,yp p+0.5)=a+0.5)=a(x(xp p+1)+b(y+1)+b(yp p+
7、0.5)+c+0.5)+c当当d0d0d0,MM在直线在直线(Q(Q点点)上方,上方,取右方取右方P P1 1;当当d=0d=0,选,选P P1 1或或P P2 2均可,约均可,约定取定取P P1 1;能否采用增量算法呢?能否采用增量算法呢?直线中点画线法若d0-M在直线上方-取P1 1;此时再下一个象素的判别式为 d d1 1=F(x=F(xp p+2,y+2,yp p+0.5)=a(x+0.5)=a(xp p+2)+b(y+2)+b(yp p+0.5)+c+0.5)+c =a(x =a(xp p+1)+b(y+1)+b(yp p+0.5)+c+a=d+a+0.5)+c+a=d+a;增量为a
8、直线中点画线法n n若dM在直线下方-取P2 2;n n此时再下一个象素的判别式为 d d2 2=F(x=F(xp p+2,y+2,yp p+1.5)=a(x+1.5)=a(xp p+2)+b(y+2)+b(yp p+1.5)+c+1.5)+c =a(x =a(xp p+1)+b(y+1)+b(yp p+0.5)+c+a+b=d+a+b +0.5)+c+a+b=d+a+b;增量为增量为a ab b直线中点画线法n n画线从画线从(x(x0 0,y,y0 0)开始,开始,d d的初值的初值d d0 0=F(x=F(x0 0+1,y+1,y0 0+0.5)=a(x+0.5)=a(x0 0+1)+b
9、(y+1)+b(y0 0+0.5)+c+0.5)+c =F(x =F(x0 0,y,y0 0)+a+0.5b=a+0.5b)+a+0.5b=a+0.5b 由于只用由于只用d d 的符号作判断,为了只包含整数运算的符号作判断,为了只包含整数运算,可以用可以用2d2d代替代替d d来摆脱小数,提高效率。来摆脱小数,提高效率。直线中点画线法void Midpoint Line(int xvoid Midpoint Line(int x0 0,int y,int y0 0,int x,int x1 1,int,int y y1 1,int color),int color)int a,b,d int
10、a,b,d1 1,d,d2 2,d,x,y;,d,x,y;a=y a=y0 0-y-y1 1,b=x,b=x1 1-x-x0 0,d=2*a+b;,d=2*a+b;d d1 1=2*a,d=2*a,d2 2=2*(a+b);=2*(a+b);x=x x=x0 0,y=y,y=y0 0;drawpixel(x,y,color);drawpixel(x,y,color);while(xx while(xx1 1)if(d0)x+;y+;d+=d if(d0,则yi+1=yi+1,否则yi+1=yi。关键是简便的求出d1-d2的符号。将2.1,2.2,2.3代入d1-d2得用dx乘等式两边,同时令p
11、i=(d1-d2)dx得在1a象限内,dx总大于0,所以pi可以判断d1-d2的符号。Pi+1为求误差的初值p1,可将x1,y1代入式2.4中的xi,yi,得到(2.4)(2.5)第1a象限内的直线Bresenham算法如下:1、画点(x1,y1),dx=x2-x1,dy=y2-y1,误差初值 p1=2dy-dx,i=12、直线的下一点位置xi+1=xi+1,如果pi0,则yi+1=yi+1,否则yi+1=yi3、画点(xi+1,yi+1)4、求下一个误差pi+1,如果pi0,则pi+1=pi+2dy-2dx,否则pi+1=pi+2dy5、i=i+1如果idx+1,则转步骤2,否则结束 程序如
12、下:程序如下:BresenhamLine(x0,y0,x1,y1,color)BresenhamLine(x0,y0,x1,y1,color)int x0,y0,x1,y1,color;int x0,y0,x1,y1,color;int x,y,dx,dy;int x,y,dx,dy;float k,e;int e;float k,e;int e;dx=x1-x0;dx=x1-x0;dy=y1-y0;dy=y1-y0;k=dy/dx;k=dy/dx;e=-0.5;x=x0;y=y0;e=-dx;e=-0.5;x=x0;y=y0;e=-dx;for(i=0;i=dx;i+)for(i=0;i 0
13、)e=e-1;e=e-2*dx;if(e1 0)e=e-1;e=e-2*dx;if(e=0)y+;if(e=0)y+;Bresenham优点:1、不必计算直线斜率,所以不做除法2、不用浮点数,只用整数3、只做整数加减运算和乘2运算,乘2可以用移位来实现2.2 圆的生成算法基础知识-圆的表示1、直角坐标法 2、极坐标法圆的扫描转换算法下面仅以圆心在原点、半径R为整数的圆为例,讨论圆的生成算法。假设圆的方程为:X2 2 +Y2 2 =R2 2圆弧扫描算法n nX2 2 +Y2 2 =R2 2Y=Sqrt(R2 2-X2 2)在一定范围内,每给定一X值,可得一Y值。当X取整数时,Y须取整。缺点:浮点
14、运算,开方,取整,不均匀。yx角度DDA法 x=xx=x0 0+Rcos+Rcos y=y y=y0 0+Rsin+Rsin dx=-Rsindx=-Rsin d d dy=Rcosdy=Rcos d d x xn+1 n+1=x=x n n+dx+dxy y n+1 n+1=y=y n n+dy+dyx xn+1 n+1=x=x n n+dx=x+dx=x n n-Rsin-Rsin d d =x =x n n-(y-(y n n-y-y 0 0)d)d y y n+1 n+1=y=y n n+dy=y+dy=y n n+Rcos+Rcos d d =y=y n n+(x+(x n n-x-
15、x 0 0)d)d 显然,确定显然,确定x,yx,y的初值及的初值及d d 值后,即可以增量方值后,即可以增量方式获得圆周上的坐标,然后取整可得象素坐标。式获得圆周上的坐标,然后取整可得象素坐标。但要采用浮点运算、乘法运算、取整运算。但要采用浮点运算、乘法运算、取整运算。中点画圆法利用圆的对称性,只须讨论利用圆的对称性,只须讨论1/81/8圆。第二个圆。第二个8 8分分圆圆P P为当前点亮象素,那么,下一个点亮的象素可为当前点亮象素,那么,下一个点亮的象素可能是能是P1P1(X Xp p+1+1,Y Yp p)或)或P2P2(X Xp p+1+1,Y Yp p+1)+1)。MP1P2P(Xp,
16、Yp)中点画圆法构造函数:构造函数:F F(X X,Y Y)=X=X2 2 +Y +Y2 2-R-R2 2;则;则 F F(X X,Y Y)=0 =0 (X X,Y Y)在圆上;)在圆上;F F(X X,Y Y)0 0 0 (X X,Y Y)在圆外。)在圆外。设设MM为为P1P1、P2P2间的中点,间的中点,M=(XM=(Xp p+1,Y+1,Yp p-0.5)-0.5)MP1P2中点画圆法有如下结论:F F(MM)MM在圆内在圆内-取取P1P1 F F(MM)=0-M=0-M在圆外在圆外-取取P2P2为此,可采用如下判别式:MP1P2中点画圆法 d=F(M)=F(xd=F(M)=F(xp p
17、+1,y+1,yp p-0.5)-0.5)=(x =(xp p+1)+1)2 2+(y+(yp p-0.5)-0.5)2 2-R-R2 2 若若d0,d=0,d=0,则则P2 P2 为下一个象素,那么再下一个为下一个象素,那么再下一个象素的判别式为:象素的判别式为:d1=F(xd1=F(xp p+2,y+2,yp p-1.5)-1.5)=(x =(xp p+2)+2)2 2+(y+(yp p-1.5)-1.5)2 2-R-R2 2 =d+=d+(2x2xp p+3+3)+(-2 y-2 yp p+2+2)即即d d 的增量为的增量为 2(x 2(xp p-y-yp p)+5.)+5.d d的初
18、值的初值:d0=F(1,R-0.5)d0=F(1,R-0.5)=1+(R-0.5)=1+(R-0.5)2 2-R-R2 2 =1.25-R =1.25-RMP1P2中点画圆法 MidpointCircle(int r,int color)MidpointCircle(int r,int color)int x,y;int x,y;float d;float d;x=0;y=r;d=1.25-r;x=0;y=r;d=1.25-r;drawpixel(x,y,color);drawpixel(x,y,color);while(xy)while(xy)if(d0)d+=2*x+3;x+if(d0)d
19、+=2*x+3;x+elsed+=2*(x-y)+5;x+;y-;elsed+=2*(x-y)+5;x+;y-;中点画圆法n n为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。n n使用e=d-0.25代替dn ne0=1-R中点画圆法n n上述算法能否再改进呢?n n注意到d的增量是x,y的线性函数,n n每当x递增1,则d的增量递增x=2n n每当y递减1,则d的增量递增y=2n nx初始值=3;y初始值=-2r+2圆的Bresenham算法yiyyi-1Xi+1xi0我们设圆的半径为r,圆心在(,),考虑从(,r)顺时针方
20、向/8圆周的生成过程。X从开始,到x=y结束。即有相应的yi+1就有两种选择:yi+1取值就要看精确值y是靠近yi还是靠近yi-1,计算公式为:令pi=d1-d2,并代入d1,d2,则有Pi为误差。如果pi0,则yi+1=yi,否则yi+1=yi-1,pi的递归式为:(2.6)Pi的初值由2.6式代入xi=0,yi=r得Bresenham圆周生成算法如下:1、求误差初值,p1=3-2r,i=1,画点(0,r)2、求下一个光栅位置,其中xi+1=xi+1,如果pi0,则yi+1=yi,否则yi+1=yi-1 3、画点(xi+1,yi+1)4、计算下一个误差,如果pi0,pi+1=pi+4xi+6
21、,否则pi+1=pi+4(xi-yi)+105、i=i+1,如果x=y,则结束,否则返回步骤22.3 区域填充法基础知识区域填充:即给出一个区域的边界,要求对边界内所有像素单元赋予指定颜色代码。区域填充最常用的是多边形填色。多边形填色即给出一个多边形的边界,要求对边界内所有像素赋予指定的颜色。要完成这些任务,首要问题是判断一个像素是在多边形内还是多边形外。常用“扫描交点的奇偶数判断法”。1、将多边形画在平面内2、用一根水平线自左向右扫描,从而与多边形相交,扫描线与边界相交奇数次后进入多边形,相交偶数次后走出多边形。上述方法似乎很完美,但并非如此,因为直线在光栅化后就变成了占有单位空间的离散点,
22、在扫描部分点时用该方法会出错。所以要对该方法作周密的改善。abcdABC扫描线填色方法有两大类:1、扫描线填色算法(Scan-Line Filling)建立在多边形边界的矢量形式数据上,可用于程序实现,也可用于交互填色。2、种子填色算法(Seed Filling)建立在多边形边界的图形形式数据上,难于用程序实现。扫描线填色算法算法的基本思想:用水平线从上到下扫描有点线段构成的多段定义多边形。每根扫描线与多边形产生一系列交点。将这些交点按照X坐标进行分类,将分类后的交点成对取出,作为两个端点,以所需要的色彩画水平直线。多边形被扫描完毕后,填色也就完成。基本思想中要解决几个问题:1、左右顶点处理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 ppt 课件 第二 基本 图形 生成 计算
限制150内