计算机图形学chap5基本图形生成算法ppt课件.ppt
《计算机图形学chap5基本图形生成算法ppt课件.ppt》由会员分享,可在线阅读,更多相关《计算机图形学chap5基本图形生成算法ppt课件.ppt(158页珍藏版)》请在三一办公上搜索。
1、计算机图形学基础,华东理工大学计算机系 谢晓玲,2,如何在指定的输出设备上根据坐标描述构造基本二维几何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性等)。,第五章 基本图形生成算法,3,图形生成的概念直线段的扫描转换圆的扫描转换多边形的扫描转换与区域填充属性处理反走样技术在OpenGL中绘制图形,第五章 基本图形生成算法,4,图形的生成:是在指定的输出设备上,根据坐标描述构造二维几何图形。图形的扫描转换:在光栅显示器等数字设备上确定一个最佳逼近于图形的象素集的过程。,图5.1 用象素点集逼近直线,图形生成的概念,5,5.1 直线的扫描转换,线画图元的扫描转换计算出落在线段上或充分靠近它
2、的一串像素,并以此像素集近似代替连续直线在屏幕上显示的过程。直线的绘制要求 (1)直线要直; (2)直线的端点要准确,无定向性无断裂; (3)直线的亮度、色泽要均匀; (4)画线的速度要快; (5)具有不同的色泽、亮度、线型等。,6,直线的扫描转换,解决的问题:给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。数值微分法(Digital Differential Analyzer, DDA)中点Bresenhan算法改进的Bresenhan算法,数值微分法数值微分法即DDA(Digital Differential Analyzer)算法,是根据直线的微分方程来计算x或y生成直
3、线的扫描转换算法。 在一个坐标轴上以单位间隔对线段取样, 以决定另一个坐标轴方向上最靠近理想线段的整数值。数值微分法的本质,是用数值方法解微分方程,通过同时对x和y各增加一个小增量,计算下一步的x、y值。,数值微分法(DDA法),8,数值微分法(DDA法),直线的微分方程:,=1/max(|x|,|y|),图5.2 DDA算法原理,max(|x|,|y|)=|x|,即|k|1的情况:,max(|x|,|y|)=|y|,此时|k|1:,数值微分法步骤:给定:两个端点P0(x0,y0)和P1(x1,y1),则:dx=(x1-x0);dy=(y1-y0);根据|dx|、|dy|,哪个大,哪个为步长参
4、数:当|dx|dy|,即|m|x1,即直线从右到左,则x=-1, y=-m当|dx|dy|,即|m|1时, 若x0 x1,即直线从右到左,则y=-1, x=-1/m,数值微分法(DDA法),void DDA_Line(int x0,int y0,int x1,int y1,int color) int i; float dx, dy, length,x,y; if (fabs(x1-x0)=fabs(y1-y0)length=fabs(x1-x0); elselength=fabs(y1-y0); dx = (x1-x0)/length; dy=(y1-y0)/length; i=1;x= x
5、0;y= y0; while(i=length) PutPixel (int(x+0.5), int(y+0.5), color); x=x+dx; y=y+dy; i+; ,x int(y+0.5) y+0.50 0 0+0.51 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,直线段的DDA扫描转换,举例: 线段P0(0,0)和P1(5,2)的DDA方法扫描转换。,12,增量算法:加法+取整直观、易实现x与dx、y与dy用浮点数表示,每一步要进行四舍五入后取整,不利于硬件实现。,数值微分法(DDA法)特点,13,中点Bresenh
6、am算法,算法原理:根据直线的斜率确定或选择变量在x或y方向上每次递增一个单位,而另一方向的增量为1或0,它取决于实际直线与相邻象素点的距离,这一距离称为误差项。,14,中点Bresenham算法,直线的方程,图5.4 直线将平面分为三个区域,假定0k1,即0 y/ x 1,x是最大位移方向,则每次x加1,若M在Q下放,y加1(取Pu);若M在Q上放,取y加0(取Pd)。,图5.5 Brensemham算法生成直线的原理,判别式:,则有:,图5.5 Brensemham算法生成直线的原理,d的意义:d=F(xM,yM)=F(xi+1,yi+0.5)=yi+0.5-k(xi+1)-b =yi+0
7、.5-k(xi+1)+b =yM-yQ 这里:yQ= k(xi+1)+b、yM = yi+0.5,图5.5 Brensemham算法生成直线的原理,误差项的递推(d10),图5.6 误差项递推(a),误差项的递推(d10),图5.6 误差项递推(b),20,初始值d的计算,中点Bresenham算法,图5.9 计算初值,21,改进:用2dx代替d ,令D2dx 则:,中点Bresenham算法改进,22,输入直线的两端点P0(x0,y0)和P1(x1,y1)。计算初始值x、y、D=x-2y、x=x0、y=y0。绘制点(x,y)。判断D的符号。若D0,则(x,y)更新为(x+1,y+1),D更新
8、为D+2x-2y;否则(x,y)更新为(x+1,y), D更新为D-2y。当直线没有画完时,重复上一步骤,否则结束。0K1时Bresenham算法程序演示,中点Bresenham算法算法步骤,例:已知:P0(0,0) P1(5,2)dy= y1-y0=2, dx= x1-x0 = 5d0 =dx-2dy = 1, 令:d1=2dy =4, d2=2(dx - dy)=6i(xi,yi) di (xi+1,yi+1 ) di+10(0,0) 1 (1,0) di-d1=-31(1,0) -3 (2,1) di+d2=32(2,1) 3 (3,1) di-d1=-13(3,1) -1 (4,2)
9、di+d2=54(4,2) 5 (5,2),中点Bresenham算法,思考讨论:斜率不同时: 以上讨论的是 0 k 1 的情况,即 0yx 的情况; 若是 0 xy (即k 1)的情况,则需将 x 和 y 的位置交换。方向不同时: 若y0,将算法中的 yy1换成yy1; 若x0,将算法中的 xx1换成xx1。,中点Bresenham算法,25,改进的Bresenham算法,假定直线段的0k1,图5.8 改进的Brensemham算法绘制直线的原理d:交点与网格线之间的误差,改进的Bresenham算法,27,误差项的计算d初=0, 每走一步:d=d+k 一旦y方向上走了一步,d=d-1,改进
10、的Bresenham算法原理,改进1:令e=d-0.5,e初=-0.5,每走一步有e=e+k。if (e0) then e=e-1;y+,误差项的计算d初=0,每走一步:d=d+k if (d0.5) then d=d-1;y+;,仍然存在小数和除法计算k。,改进2:用E=2ex来替换e,e初=-0.5每走一步有e=e+kif (e0) then e=e-1;y+;,E初=-0.5*2x=-x每走一步有E=(e+k)*2x=E+2y if (e0) then E=(e-1)*2x=E-2x;y+;,30,1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、e=-x
11、、x=x0、y=y0。3.绘制点(x,y)。4.e更新为e+2y,判断e的符号。若e0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2x;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。,改进的Bresenham算法算法步骤,例:已知:P0(0,0) P1(5,2)dy= y1-y0=2, dx= x1-x0 = 5e0 =-dx = -5, 令:2dy =4, 2dx=10i(xi,yi) ei e+2dy (xi+1,yi+1 ) e-2dx0(0,0) -5 -1 (1,0)1(1,0) -1 3 (2,1) -7 2(2,1) -7 -3
12、 (3,1) 3(3,1) -3 1 (4,2) -94(4,2) -9 -5 (5,2),改进的Bresenham算法,32,5.2 圆的扫描转换,为了方便起见,只考虑圆心中心在原点、半径为整数R的圆x2+y2=R2 。,图5.9 八分法画圆,Void cirput(int x0,int y0,int x,int y,int color) PutPixel(x0+x,y0+y,color); PutPixel(x0+y,y0+x,color); PutPixel(x0+y,y0-x,color); PutPixel(x0+x,y0-y,color); PutPixel(x0-x,y0-y,c
13、olor); PutPixel(x0-y,y0-x,color); PutPixel(x0-y,y0+x,color); PutPixel(x0-x,y0+y,color);,34,解决问题:只要扫描转换八分之一圆弧(从(0,R)顺时针到(R/2,R/2) ),就可以求出整个圆弧的象素集。,圆的扫描转换,图5.10 1/8圆弧,35,圆的扫描转换,简单方程生成圆弧中点Bresenham算法,36,简单方程产生圆弧,算法原理:利用其函数方程,直接离散计算。,圆的函数方程为:,37,圆的极坐标方程为:,简单方程产生圆弧,38,构造函数F(x,y)=x2+y2-R2。对于圆上的点,有F(x,y)=0
14、;对于圆外的点,F(x,y)0;而对于圆内的点,F(x,y)0。,给定圆心在原点,半径为整数R的圆,其方程为,中点Bresenham画圆,图5.11 中点Bresenham画圆的原理,当F(M)0,M在圆外,取Pd(xi+1,yi-1);当F(M)=0,M在圆上,取Pu或Pd;,40,当d0时,下一点取Pu(xi +1,yi);当d0时,下一点取Pd(xi +1,yi-1)。,构造判别式:,中点Bresenham画圆,误差项的递推(d10),图5.12 d0的情况,误差项的递推(d10),43,判别式的初始值:有浮点运算,中点Bresenham画圆,改进:用d-0.25代替d,则:d0=1-R
15、当di0 di+1=F(xi+2,yi-1.5) =(xi+2)2+(yi-1.5)2-R2 =(xi+1)2+(yi-0.5)2-R2+2xi+3+(-2yi+2) =di+2(xi-yi)+5,45,1.输入圆的半径R。2.计算初始值d=1-R、x=0、y=R。3.绘制点(x,y)及其在八分圆中的另外七个对称点。4.判断d的符号。若d0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。5.当xy时,重复步骤3和4。否则结束。程序演示,中点Bresenham画圆算法步骤,设圆半径R=10,初始点(0
16、,10),d0=1-R=-9idi下一个点 di+10 -9 (1,10) =di+2Xi+1+1=-6-6 (2,10) =di+2Xi+1+1=-1-1 (3,10) =di+2Xi+1+1=66 (4,9) =di+2Xi+1-2Yi-1+1=-3-3 (5,9) =di+2Xi+1+1=88 (6,8) =di+2Xi+1-2Yi-1+1=55 (7,7),中点Bresenham画圆,47,5.4 多边形的扫描转换与区域填充,多边形的扫描转换主要是通过确定穿越区域的扫描线的覆盖区间来填充。区域填充是从给定的位置开始涂描直到指定的边界条件为止。,48,多边形的扫描转换与区域填充,多边形的
17、扫描转换边缘填充算法区域填充相关概念,49,多边形的扫描转换,顶点表示用多边形的顶点序列来刻划多边形,几何意义强,但不适合着色。 点阵表示是用位于多边形内的象素的集合来刻划多边形,没有几何意义,但适合着色扫描转换多边形:从多边形的顶点信息出发,求出位于其内部的各个象素,并将其颜色值写入帧缓存中相应单元的过程。,多边形扫描转换顶点表示 点阵表示,50,多边形的扫描转换,X扫描线算法改进的有效边表算法,51,基本思想:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的所有象素。,X扫描线算法原理,图5.23 x-扫描线算法填充多边形,52,1.确定多边形所占有的最大扫描线数,
18、得到多边形顶点的最小和最大y值(ymin和ymax)。2.从y=ymin到y=ymax,每次用一条扫描线进行填充。3.对一条扫描线填充的过程可分为四个步骤:求交:计算扫描线与多边形所有边的交点;排序:按x轴排序所有交点;交点配对:每对交点代表扫描线与多边形的一个相交区域;区间填色:根据相交区域填色。,X扫描线算法算法步骤,图 多边形域的填充,求交:扫描线6与多边形的边界线交于A、 B、 C、 D。得到的各交点的横坐标分别为2、 4、 8、 11;排序:按递增排序:2、 4、 8、 11;配对:相交区间为2, 4、8, 11;填色:这两个区间的像素置成多边形色, 把相交区间外的像素置成背景色。,
19、X扫描线算法算法步骤,54,交点的取整规则:使生成的像素全部位于多边形之内。(用于直线等图元扫描转换的四舍五入原则可能导致部分像素位于多边形之外,从而不可用)。假定非水平边与扫描线y=e相交,交点的横坐标为x,规则如下:,X扫描线算法取整规则,规则1:如X为小数,即交点落于扫描线上两个相邻像素之间时:交点位于左边界之上,向右取整;交点位于右边界之上,向左取整;,图 取整规则1,规则2:如X为整数,即交点落于扫描线上某像素上时,按照“左闭右开” 原则处理交点:交点处于左边界之上,交点不变;交点处于右边界之上,交点的x坐标减1;,图 取整规则2,当扫描线与多边形顶点相交时,交点的取舍,保证每一条扫
20、描线与多边形的交点个数为偶数,使交点正确配对。规则3:当扫描线与多边形的顶点相交时,若共享顶点的两条边分别落在扫描线的两边,交点只算一个;若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个。,图 取整规则3,X扫描线算法取整规则,填充过程实例,58,实际处理:只要检查顶点的两条边的另外两个端点的Y值,按这二个y值中大于交点y值的个数是0、1、2来决定交点个数是0个、1个、还是2个。,X扫描线算法取整规则,图5.25 与扫描线相交的多边形顶点的交点数,59,改进的有效边表算法(Y连贯性算法),x-扫描线算法需要与多边形所有边求交,效率低下。改进原理:处理一条扫描线时,仅对有效边求交。利用
21、扫描线的连贯性。利用多边形边的连贯性。 当扫描线Yi与某一条边的交点坐标为Xi,那么下一条扫描线Yi+1与该边的交点Xi+1的计算,只需加上一个增量即可:Xi+1= Xi+1/k,60,边表(Edge Table,ET):多边形的所有边放在一个表中。有效边(Active Edge):与当前扫描线相交的多边形的边,也称为活性边。有效边表(Active Edge Table, AET):把有效边按与扫描线交点x坐标递增的顺序存放在一个链表中,此链表称为有效边表。有效边表的每个结点: x ymax 1/k next,改进的有效边表算法(Y连贯性算法),有效边链表结点的数据结构x:当前扫描线与边的交点
22、坐标Ymax:该边所交的最高扫描线号Ymax 1/k:从当前扫描线到下一条扫描线间x的增量边的连贯性,扫描线的联贯性; 只需对当前扫描线的有效边表稍作修改,就可以得到下一条扫描线的有效边表。,改进的有效边表算法(Y连贯性算法),62,首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点,称为一个桶,则对应多边形覆盖的每一条扫描线。将每条边的信息链入与该边最小y坐标(ymin )相对应的桶处。也就是说,若某边的较低端点为ymin,则该边就放在相应的扫描线桶中。,改进的有效边表算法构造边表,63,每条边的数据形成一个结点,内容包括:该扫描线与该边的初始交点x(即较低端点的x
23、值),1/k,以及该边的最大y值ymax。x|ymin ymax 1/k NEXT同一桶中若干条边按X|ymin由小到大排序,若X|ymax 相等,则按照1/k由小到大排序。,改进的有效边表算法构造边表,解决顶点交点计为1时的情形:,图5.28 将多边形的某些边缩短以分离那些应计为1个交点的顶点下闭上开:检测是否存在某边的ymax等于另一边的ymin,假如有,则将ymax的边缩短(ymax=ymax-1)如图5.28 (b),以保证顶点交点计数为1 。,图5.27 多边形P0P1P2P3P4P5P6,图5.27 多边形P0P1P2P3P4P5P6,67,初始化:构造边表,AET表置空;将第一个
24、不空的ET表中的边与AET表合并;由AET表中取出交点对进行填充。填充之后删除y=ymax的边;yi+1=yi+1,根据xi+1=xi+1/k计算并修改AET表,同时合并ET表中y=yi+1桶中的边,按次序插入到AET表中,形成新的AET表;AET表不为空则转,否则结束。,改进的有效边表算法构造有效边表,进一步改进,使得无须缩短任何边:建新边表ET将扫描线坐标Y的初值置为ET中非空元素的最小序号置AET为空执行以下步骤,直至ET和AET都为空把ET中Y信息与AET合并,同时保存AET中按X值实现的排序序列对于扫描线Y,在一对交点之间填充所需要的像素值从AET中删除Yi+1Ymax的项对于仍留在
25、AET中的每一项,用x+1/m代替x检查并保存AET中的各项,按X值排序使Y增1,成为下一条扫描线的坐标,各扫描线的新边表 NET,特点:利用边的连贯性,加速交点的计算 利用AET,排除盲目求交 利用扫描线的连贯性,避免逐点判别缺点:涉及表的维护和排序,不适合硬件。,改进的有效边表算法,求余运算假定A是给定的正数,则M得余数定义为M=A-M边缘填充法当计算机内用n位二进制表示M,A=2n-1, 则M=A-M=A-(A-M)=M。 即对M作偶次求余,运算结果是M; 对M作奇次求余,运算结果是M。,边缘填充算法,73,边缘填充算法,(逐边向右求补)基本思想:按任意顺序处理多边形的每条边。处理时,先
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 chap5 基本 图形 生成 算法 ppt 课件
链接地址:https://www.31ppt.com/p-1438714.html