第二章光栅图形学.ppt
《第二章光栅图形学.ppt》由会员分享,可在线阅读,更多相关《第二章光栅图形学.ppt(167页珍藏版)》请在三一办公上搜索。
1、计算机图形学翁彬,第2章 光栅图形学,什么是光栅图形学?光栅显示器 图形光栅化、光栅化图形的处理,光栅图形学的研究内容2.1直线段的扫描转换算法2.2圆弧的扫描转换算法2.3多边形的扫描转换与区域填充2.4字符2.5裁剪2.6反走样2.7消隐,2.1 直线段的扫描转换算法,直线的扫描转换:确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作。三个常用算法:数值微分法(DDA)中点画线法Bresenham算法。,2.1.1 数值微分(DDA)法,基本思想 已知过端点 的直线段L:直线斜率为 从 的左端点 开始,向 右端点步进。步长=1(个象素),计算相应的y坐标;取象素点(x,
2、round(y)作为当前点的坐标。这种方法直观,但效率太低,因为每一步需要一次浮点乘法、一次加法和一次舍入运算。,2.1.1 数值微分(DDA)法,作为最底层的光栅图形算法,在通常的CAD/图形系统中,会被大量应用,因此,哪怕节约一个加法或减法,也是很了不起的改进。由此出发点,导致增量算法的思想。增量算法:在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得,则称为增量算法。,2.1.1 数值微分(DDA)法,计算当 时;即:当x每递增1,y递增k(即直线斜率);,2.1.1 数值微分(DDA)法,例:画直线段 k=0.4x y int(y+0.5)y+0.50 0 0 0注
3、:网格点表示象素,2.1.1 数值微分(DDA)法,例:画直线段x int(y+0.5)y+0.50 0 01 0 0.4+0.52 1 0.8+0.53 1 1.2+0.54 2 1.6+0.55 2 2.0+0.5注:网格点表示象素,2.1.1 数值微分(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+)drawpixel(x,int(y+0.5),color);y=y+k;,2.1.1 数
4、值微分(DDA)法,注意上述分析的算法仅适用于k 1的情形。在这种情况下,x每增加1,y最多增加1。问题:当 k 1时,会如何?(答案见下页),k 1 示意图,2.1.1 数值微分(DDA)法,当 k 1时,必须把x,y地位互换,y每增加1,x相应增加1/k。,2.1.1 数值微分(DDA)法,缺点:在此算法中,y、k必须是float,且每一步都必须对y进行舍入取整,不利于硬件实现。,DDA算法小结,直线的显式方程(两点式)象素是整数的(x每次增加1,取象素点(x,round(y))最简单算法效率低改进为增量算法(当x每递增1,y递增k),采用增量思想的DDA算法,每计算一个象素,只需计算一个
5、加法,是否最优?如非最优,如何改进?目标:进一步将一个加法改为一个整数加法。新思路 DDA算法采用两点式,可否采用其他的直线表示方式?,2.1.2 中点画线法,基本思想当前象素点为(xp,yp)。下一个象素点为P1 或P2。设M=(xp+1,yp+0.5),为p1与p2之中点,Q为理想直线与x=xp+1垂线的交点。将Q与M的y坐标进行比较。当M在Q的下方-P2离直线更近更近-取P2。M在Q的上方-P1离直线更近更近-取P1M与Q重合,P1、P2任取一点。,2.1.2 中点画线法,问题:如何判断M与Q点的关系?,2.1.2 中点画线法,假设直线方程为:F(x,y)=ax+by+c=0其中a=y0
6、-y1,b=x1-x0,c=x0y1-x1y0由常识知:欲判断M点是在Q点上方还是在Q点下方,只需把M代入F(x,y),并检查它的符号。,2.1.2 中点画线法,构造判别式:d=F(M)=F(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c 其中a=y0-y1,b=x1-x0,c=x0y1-x1y0当d0,M在L(Q点)上方,取右方P1为下一个象素;当d=0,选P1或P2均可,约定取P1为下一个象素;,2.1.2 中点画线法,但这样做,每一个象素的计算量是4个加法,两个乘法。d=a(xp+1)+b(yp+0.5)+c,2.1.2 中点画线法,如果也采用增量算法呢?,2.1.2
7、中点画线法,d是xp,yp的线性函数,因此可采用增量计算,提高运算效率。d=a(xp+1)+b(yp+0.5)+c,2.1.2 中点画线法,若当前象素处于d0情况,则取正右方象素P1(xp+1,yp),要判下一个象素位置,应计算 d1=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)+c=d+a;增量为ad=a(xp+1)+b(yp+0.5)+c,2.1.2 中点画线法,若d0时,则取右上方象素P2(xp+1,yp+1)。要判断再下一象素,则要计算 d2=F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b;增量为ab d=a(xp+1)+b(yp+
8、0.5)+c,2.1.2 中点画线法,至此,至少新算法可以和DDA算法一样好。能否再做改进?,2.1.2 中点画线法,能否实现整数运算?,2.1.2 中点画线法,画线从(x0,y0)开始,d的初值d0=F(x0+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c=F(x0,y0)+a+0.5b=a+0.5b。由于只用d 的符号作判断,为了只包含整数运算,可以用2d代替d来摆脱小数,提高效率。令 d0=2a+b,d1=2a,d2=2a+2b,我们有如下算法。,2.1.2 中点画线法,void Midpoint Line(int x0,int y0,int x1,int y1,int co
9、lor)int a,b,d1,d2,d,x,y;a=y0-y1,b=x1-x0,d=2*a+b;d1=2*a,d2=2*(a+b);x=x0,y=y0;drawpixel(x,y,color);while(xx1)if(d0)x+,y+,d+=d2;else x+,d+=d1;drawpixel(x,y,color);/*while*/*mid PointLine*/,2.1.2 中点画线法,例:用中点画线法 ixiyid1001210-33213431-15425,中点画线法小结,中点与交点位置来判断象素选取引入直接的隐式方程F(x,y)=ax+by+c=0但计算量大,故又改进为增量算法(此
10、处,增量分两种情况)为进一步提高效率,修改为全是整数计算的算法(2d代替d,同时增量也做相应调整),2.1.2 中点画线法,思考题:P55 2-2 用中点画线法扫描转换从点(1,0)到(4,7)经过的直线段,并给出每一步的判别值。,DDA算法采用点斜式,中点法采用隐式表示。中点法可以有整数算法。其他表示可以推出整数算法吗?,2.1.3 Bresenham算法,基本思想过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。,2.1.3 Bresenham算法,设直线方程为:,其中k=dy/dx。因为直线的
11、起始点在象素中心,所以误差项d的初值d00。X下标每增加1,d的值相应递增直线的斜率值k,即ddk。当d0.5时,选择当前象素的右上方象素(),修改比较的基点为改点,即将d-1而当d0.5时,选择当前象素的右方象素(),此时不改变基点为方便计算,令ed-0.5,e的初值为-0.5,增量为k。当e0时,取当前象素(xi,yi)的右上方象素();而当e0时,更接近于右方象素()。,2.1.3 Bresenham算法,例:Line:P0(0,0),P1(5,2)k=dy/dx=0.4 x y e 0 0-0.5 1 0-0.1 2 1 0.3 3 1-0.3 4 2 0.1 5 2-0.5 e每次加
12、k,若e大于零则y加1且e减1,若e小于零则不变,2.1.3 Bresenham算法,void Bresenhamline(int x0,int y0,int x1,int y1,int color)int x,y,dx,dy;float k,e;dx=x1-x0,dy=y1-y0,k=dy/dx;e=-0.5,x=x0,y=y0;for(i=0;idx;i+)drawpixel(x,y,color);x=x+1,e=e+k;if(e0)y+,e=e-1;,2.1.3 Bresenham算法,可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可作如下替换:,2.1.3 Bresenha
13、m算法,void Bresenhamline(int x0,int y0,int x1,int y1,int color)int x,y,dx,dy,e;dx=x1-x0,dy=y1-y0;e=-dx,x=x0,y=y0;for(i=0;idx;i+)drawpixel(x,y,color);x=x+1,e=e+2*dy;if(e0)y+,e=e-2*dx;,int x,y,dx,dy;float k,e;dx=x1-x0,dy=y1-y0;k=dy/dx,e=-0.5;x=x0,y=y0;for(i=0;idx;i+)drawpixel(x,y,color);x=x+1,e=e+k;if(e
14、0)y+,e=e-1;,2.1.3 Bresenham算法,y每次增k 误差项每次也增k(同DDA算法)通过 交点 与 基点 的距离 d 来判断为了用正负号判断,ed-0.5为了变为整数算法最终,Bresenham算法也是每个象素,需一个整数算法,其优点是可以用于其他二次曲线。,2.2 圆弧的扫描转换算法,圆的特征:八对称性。只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集中点画圆法考虑中心在原点,半径为R的第二个8分圆,构造判别式(圆方程),2.2 圆弧的扫描转换算法,若 d=0,则应取P2为下一象素,而且下一象素的判别式为 第 一个象素是(0,R),判别式d的初始值为,2.2 圆弧的扫
15、描转换算法,MidPointCircle(int r int color)int x,y;float d;x=0;y=r;d=1.25-r;circlepoints(x,y,color);/显示圆弧上的八个对称点 while(x=y)if(d0)d+=2*x+3;else d+=2*(x-y)+5;y-;x+;circlepoints(x,y,color);,2.2 圆弧的扫描转换算法,为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。如何改?,2.2 圆弧的扫描转换算法,使用e=d-0.25代替de0=1-R,圆弧的中点扫描转换
16、算法,利用圆八对称性类似于直线的中点法使用了圆的隐式方程两种不同的增量(0时,0时)为了改为整数算法 e=d-0.25代替d,小结,2.1 直线段的扫描转换算法2.1.1 数值微分(DDA)法2.1.2 中点画线法2.1.3 Bresenham算法2.2 圆弧的扫描转换算法,2.3 多边形的扫描转换与区域填充,多边形的表示方法顶点表示点阵表示顶点表示:用多边形顶点的序列来刻划多边形。直观、几何意义强、占内存少;不能直接用于面着色。点阵表示:用位于多边形内的象素的集合来刻划多边形。失去了许多重要的几何信息;便于运用帧缓冲存储器表示图形,易于面着色。,2.3 多边形的扫描转换与区域填充,多边形的扫
17、描转换:把多边形的顶点表示转换为点阵表示,也就是从多边形的给定边界出发,求出位于其内部的各个象素,并给帧缓冲器内的各个对应元素设置相应的灰度和颜色,通常称这种转换为多边形的扫描转换。,2.3 多边形的扫描转换与区域填充,区域指已经表示成点阵形式的填充图形,它是象素的集合。区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的。,2.3 多边形的扫描转换与区域填充,区域表示方法:内点表示、边界表示内点表示枚举出区域内部的所有像素内部的所有像素着同一个颜色边界像素着与内部像素不同的颜色边界表示枚举出边界上所有的像素边界上的所有像素着同一颜色内部像素着
18、与边界像素不同的颜色,多边形分为凸多边形、凹多边形、含内环的多边形。,逐点判断算法,逐点判断算法:逐个像素判别其是否位于多边形内部判断一个点是否位于多边形内部:射线法从当前像素发射一条射线,计算射线与多边形的交点个数内部:奇数个交点外部:偶数个交点,逐点判断算法,判断一点是否位于多边形内部?,逐点判断算法,算法描述for(y=0;y=y_resolution;y+)for(x=0;x=x_resolution;x+)if(inside(polygon,x,y)setpixel(framebuffer,x,y,polygon_color)elsesetpixel(framebuffer,x,y,
19、background_color),逐点判断算法的不足,速度慢:几十万甚是几百万像素的多边形内外判断,大量的求交、乘除运算没有考虑像素之间的联系结论:逐点判断算法不可取!,2.3.1.1 扫描线算法,一个多边形与若干扫描线,2.3.1多边形的扫描转换,2.3.1.1 扫描线算法基本思想:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。对于一条扫描线填充过程可以分为四个步骤:求交排序配对填色,多边形扫描转换算法,P0,P1,P2,P3,P4,P5,P6,P7,扫描转换示意图,相邻像素之间的连贯性,扫描线算法充分利用了相邻像素之间的连贯性,避免了对像素
20、的逐点判断和求交运算,提高了算法效率各种连贯性的定义区域连贯性扫描线连贯性边的连贯性,区域连贯性,区域的连贯性是指多边形定义的区域内部相邻的像素具有相同的性质。例如具有相同的颜色,区域的连贯性,区域连贯性,两条扫描线之间的长方形区域被所处理的多边形分割成若干梯形(三角形可以看作退化梯形)梯形的底边为扫描线,梯形的腰为多边形的边或窗口边缘,区域的连贯性,区域连贯性,梯形分为两类:多边形内部和多边形外部两类梯形在多边形内部相间排列(相邻的两个梯形必然有一个位于多边形内部,有一个在多边形外部),区域的连贯性,区域连贯性,推论:如果上述梯形属于多边形内(外),那么该梯形内所有点的均属于多边形内(外)。
21、效率提高的根源:逐点判断区域判断,扫描线连贯性,区域连贯性在一条扫描线上的反映,扫描线的连贯性,扫描线连贯性,交点序列:扫描线与多边形的交点个数为偶数(1,2,3,4,5,6)红色区间(1,2)、(3,4)、(5,6)位于多边形内部其余绿色区间位于多边形外部两类区间相间排列,扫描线的连贯性,扫描线连贯性,推论:如果上述交点区间属于多边形内(外),那么该区间内所有点均属于多边形内(外)。效率提高的根源:逐点判断区间判断,边的连贯性,边的连贯性:直线的线性性质在光栅上的表现,边的连贯性,1(x1,y1)2(x2,y2),11(x11,y11)22(x22,y22),扫描线与边的交点,边的连贯性,相
22、邻扫描线(y1=y11+1)与多边形的同一条边的交点存在如下关系:当知道扫描线与一条边的一个交点之后,通过上述公式可以通过增量算法迅速求出其他交点,边的连贯性,边的连贯性,推论:边的连贯性是连接区域连贯性和扫描线连贯性的纽带。扫描线连贯性“”边连贯性“”区域连贯性,2.3.1.1 扫描线算法,扫描线与多边形的顶点或边界相交时,必须进行正确的交点取舍。只需检查顶点的两条边的另外两个端点的y值。按这两个y值中大于交点y值的个数是0,1,2来决定。,2.3.1.1 扫描线算法,数据结构结点内容 x:当前扫描线与边的交点坐标x:从当前扫描线到下一条扫描线间x的增量ymax:该边所交的最高扫描线号yma
23、x,2.3.1.1 扫描线算法,数据结构新边表(NET):存放在该扫描线第一次出现的边。若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中上图所示各条扫描线的新边表NET,2.3.1.1 扫描线算法,数据结构活性边表(AET):把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中,2.3.1.1 扫描线算法,假定当前扫描线与多边形某一条边的交点的x坐标为x,则下一条扫描线与该边的交点不要重计算,只要加一个增量x。设该边的直线方程为:ax+by+c=0;若yyi,x=xi;则当y=yi+1时,其中 为常数,并约定a=0时,。,算法过程,void
24、polyfill(polygon,color)int color;多边形 polygon;for(各条扫描线i)初始化新边表头指针NET i;把y min=i 的边放进边表NET i;y=最低扫描线号;初始化活性边表AET为空;for(各条扫描线i),算法过程,把新边表NET i 中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;遍历AET表,把配对交点区间(左闭右开)上的象素(x,y),用drawpixel(x,y,color)改写象素颜色值;i+;遍历AET表,把y max=i 的结点从AET表中删除,并把y max i 结点的x值递增x;/*polyfill*/,思考题,已知
25、多边形P=(P0P1P2P3P4P5P6P0);其各边坐标分别为(2,5)(2,10)(9,6)(16,11)(16,4)(12,2)(7,2)建立其新边表和活性边表,新边表,y=3,y=8,活动边表的例子,扫描线算法小结,建立新边表按照扫描线顺序处理每条扫描线构造活性边表(x递增插入排序)中间考虑交点取舍根据当前活性边表选取像素进行填充(x方向)从活性边表中删除y max=i 的结点,2.3.1.2边界标志算法,基本思想:帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的象素打上标志。填充。对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象素。取一个布尔变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 光栅 图形学
链接地址:https://www.31ppt.com/p-5954467.html