基本光栅图形算法课件.ppt
《基本光栅图形算法课件.ppt》由会员分享,可在线阅读,更多相关《基本光栅图形算法课件.ppt(100页珍藏版)》请在三一办公上搜索。
1、2、,基本光栅图形算法,2、 基本光栅图形算法,数学表示的若干方法,1)数学方程2)点集3)边界表示4)关系表示,数学表示的若干方法1)数学方程,常用的图形对象,线段圆多边形字符等,常用的图形对象线段,一、直线,在光栅显示器的荧光屏上生成一个对象,实质上是往帧缓存寄存器的相应单元中填入数据。线段 理想的是无数多的零面积的点构成。 而在实际显示中,在光栅扫描显示器上,线段是由有限多的像素组成的,像素是有面积的。 画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的象素序列,并填入色彩数据的过程。这个过程也称为直线光栅化。,一、直线在光栅显示器的荧光屏上生成一个对象,实
2、质上是往帧缓存,而且除了水平、垂直和对角线上的线段,其他的线段像素并不一定能准确地落在线段上。,而且除了水平、垂直和对角线上的线段,其他的线段像素并不一定能,最接近数学上的直线:生成的线要直:但实际选择最靠近直线的可寻址点来逼近。,理想的绘制,绘制线段的要求,最接近数学上的直线:绘制线段的要求,绘制线段的要求,起点和终点要准:在绘制线段的过程中由于受精度 的影响,线段的终点与原终点有一个累积误差, 导致线段的终点不准。,绘制线段的要求起点和终点要准:在绘制线段的过程中由于受精度,绘制线段的要求,粗细要均匀 :由于选点不均匀,造成线段 粗细不均匀,直观上反映出线段的亮度不均匀。,绘制线段的要求粗
3、细要均匀 :由于选点不均匀,造成线段,光栅显示平面上,我们只能用二维光栅格网上尽可能靠近这条直线的象素点的集合来表示它。每个象素具有一定的尺寸,是显示平面上可被访问的最小单位,它的坐标x和y只能是整数,也就是说相邻象素的坐标值是阶跃的而不是连续的。,光栅显示平面上,我们只能用二维光栅格网上尽可能靠近这条直线的,实际绘制,实际绘制,线段的笛卡儿斜率截距方程,若其始坐标和终点坐标分别为:,则斜率为,截距为,(1),(2),(3),显示直线的算法可以直线方程(1)、(2)和(3)为基础。,线段的笛卡儿斜率截距方程若其始坐标和终点坐标分别为:则斜率为,1. 逐点比较法,算法的基本思想:在绘制直线的过程
4、中,每绘制一个点,就与原直线进行比较,根据比较的结果决定下一步的走向,这样一步一步逼近直线。,保证要绘制的点尽可能的靠近直线而不发生远离直线的趋向。,1. 逐点比较法算法的基本思想:在绘制直线的过程中,每绘制保,绘制思路,由一个点到下一个点的走法是只在X方向或Y 方向走一步。,绘制思路由一个点到下一个点的走法是只在X方向或Y 方向走一步,计算偏差,K1,K2,计算偏差 K1K2,设 =tg-tg,于是有 1) =0,点在直线上; 2) 0,点在直线上方; 3) 0,点在直线下方。,设偏差计算公式为: = tg-tg=,设 =tg-tg 于是有 1) =0,点在直线,偏差计算,可以简化为,根据
5、计算出偏差,然后确定下一步的走向。初始:,则 =0;,第一步:如果选择X方向,则,若选择Y方向,则,所以选择X方向走,则第一步选择(1,0)点处,偏差计算可以简化为根据 计算出偏差,然后确定下一步,起点(0,0)终点(7,5) XA=7 YA=5,步数走X的偏差走Y的偏差最后选择000(0,0)1-57走X,绘制结果,绘制结果,偏差递推公式,1) 时,走X方向一步,即,2) 时,走Y方向一步,即,偏差递推公式1) 时,走X方向一步,即2,偏差递推公式,以上讨论的是起点为原点,第一象限的情况,对于其他情况下的绘制直线的偏差计算和偏差判别,推导也很简单。,偏差递推公式以上讨论的是起点为原点,第一象
6、限的情况,对于其他,Fi=0Fi01象限X1Y12象限Y1X1,终点判别,判别终点的方法:设立计数器,计数取X或Y方向的最大增量值(计长方向),在计长方向每走一步,计数器减1,直到计数器值为零为止。,终点判别判别终点的方法:设立计数器,计数取X或Y方向的,绘制直线,绘制直线,2. DDA(Digital Differential Analyzer)数字微分,该算法是建立在微分方程的基础上。由 到 的直线段满足的微分方程为:,2. DDA(Digital Differential An,因此有,则有,令,有,因此有则有令有,此递归式的初值为直线的起点 ,这样,就可以用加法来生成一条直线。,Voi
7、d dda_line (xa, ya, xb, yb,c) float delta_x, delta_y, x, y; int dx, dy, steps, k; dx=xb-xa; dy=yb-ya; if (abs(dx)abs(dy) steps=abs(dx); else steps=abs (dy);delta_x=(float)dx / (float)steps;delta_y=(float)dy / (float)steps;x=xa;y=ya;putpixel(round(x),round(y), c);for (k=1; k=steps; k+)x+=delta_x;y+=d
8、elta_y;putpixel(round(x),round(y), c);,此递归式的初值为直线的起点 ,这,DDA绘制的直线,1/15;,DDA绘制的直线1/15;,基本光栅图形算法课件,算法特点:,该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。,算法特点:该算法简单,实现容易,但由于在循环中涉及实型数的,3. Bresenham算法,设直线从起点(x1, y1)到终点(x2, y2)。直线可表示为方程y=mx+b。其中 b = y1 - m * x1, m = 本算法由Bresenham在1965年提出。算法的基本思想:每次迭代在增量最大方向上均走一步,其
9、方向由增量的正负而定,另一方向上是否也走,取决于计算出来的点与直线上的点的误差,根据误差决定是否走一步。,3. Bresenham算法设直线从起点(x1, y1)到终,xi+1=xi+Dxyi+1=yi+Dy按照直线从(x1,y1)到(x2,y2)的方向不同,分为8个象限。对于方向在第1a象限内的直线而言,D x=1,D y=m。对于方向在第1b象限内的直线而言,取值Dy=1,Dx=1/m。各象限中直线生成时Dx, Dy的取值列在下页表中。,xi+1=xi+Dx,象限|dx|dy|?D xD y1a 1m1bX1/m,绘制的直线时点的选取,yi,yi+1,绘制的直线时点的选取 yi yi+1,
10、选择哪一个点?(Xi1, Yi,r)还是 (Xi1,Yi+1,r)用Yi+1与Yi,r进行误差计算,误差大于0.5选择上面的点,否则选择下面的点。使用偏差来计算确定那一个点。,选择哪一个点?,偏差计算,设偏差为,当 时,计算的点(实际直线上的点)在 中点的上方,取当 0 时,计算的点(实际直线上的点)在 中点的下方,取,整理后,有,偏差计算设偏差为当 时,计算,偏差的递推关系,误差,因为,有,偏差的递推关系误差因为有,此时,算法中仍有浮点数运算,而且m=dy/dx, 并且dx0,所以我们引入 F = 2*dx*F与 的符号相同可以用来作为判别式。因此,初始x=x1,y=y1,F1=2dy-dx
11、其递推公式:若Fi=0,则xi+1=xi+1,yi+1=yi+1, Fi+1=Fi+2(dy-dx);,此时,算法中仍有浮点数运算,而且m=dy/dx, 并且dx,总结:算法公式,初始条件: F1=2dy-dx当Fi0时: yi+1=yi+1,xi+1=xi+1,Fi+1=Fi+2(dy-dx)否则:yi+1=yi,xi+1=xi+1, Fi+1=Fi+2dy,总结:算法公式初始条件:,第一象限下算法思想如下:,此时满足:0m1且x10 则yi+1=yi+1; 否则yi+1=yi;3、画点(xi+1, yi+1);4、求下一个误差Pi+1; if Pi0 则Pi+1=Pi+2dy-2dx; 否
12、则Pi+1=Pi+2dy;5、i=i+1; if idx+1则转4;否则end,第一象限下算法思想如下:此时满足:0m1且x1x2,算法的完善,所有象限,线段的方向可分为八种,从原点出发射向八个区。由线段所在区域位置可决定xi+1和yi+1的变换规律。,1a、2a,3a、4a,1b、4b,2b、3b,算法的完善,所有象限线段的方向可分为八种,从原点出发射向八个,容易证明:当线段处于a区时,以|dx|和|dy|代替前面公式中的dx和dy,当线段处于b区时,将公式中的|dx|和|dy|对换,则上述两公式仍有效。,容易证明:当线段处于a区时,以|dx|和|dy|代替前面公式,Bresenham算法的
13、优点,Bresenham算法的优点是:1、不必计算直线之斜率,因此不做除法;2、不用浮点数,只用整数;3、只做整数加减法和乘2运算,而乘2运算可以用硬件移位实现。Bresenham算法速度很快,并适于用硬件实现。,Bresenham算法的优点Bresenham算法的优点是:,程序代码:,由上述算法思想编制的程序如下。这个程序适用于所有8个方向的直线的生成。程序用色彩C画出一条端点为(x1, y1)和(x2, y2)的直线。其中变量的含义是:P是误差;const1和const2,是误差的逐点变化量;inc是y的单位递变量,值为1或-1;tmp是用作象限变换时的临时变量。程序以判断|dx|dy|为
14、分支,并分别将2a, 3a象限的直线和3b, 4b象限的直线变换到1a, 4a和2b, 1b方向去,以求得程序处理的简洁。,程序代码:由上述算法思想编制的程序如下。这个程序适用于所有8,代码:,void line (x1, y1, x2, y2, c)int x1, y1, x2, y2, c;int dx, dy,x, y, p, const1, const2, inc, tmp;dx=x2-x1;dy=y2-y1;if (dx*dy=0) /*准备x或y的单位递变值。*/ inc=1;elseinc= -1;if (abs(dx)abs(dy) if(dx0) tmp=x1; /*将2a,
15、 3a象限方向*/ x1=x2; /*的直线变换到1a, 4a*/ x2=tmp; /*象限方向去*/ tmp=y1; y1=y2; dx=-dy; dy=-dy; ,=2*dy-dx; const1=2*dy; /*注意此时误差的*/ const2=2*(dy-dx); /*变化参数取值. */ x=x1; y=y1; set_pixel(x, y, c); while (xx2) x+; if (p0) p+=const1; else y+=inc; p+=const2; set_piexl(x, y, c); ,代码:void line (x1, y1, x2, y2,代码:,else
16、if (dy0) tmp=x1; /* 将3b, 4b象限方向的*/ x1=x2; /*直线变换到2b, 1b */ x2=tmp; /*象限方向去. */tmp=y1; y1=y2; dx=-dy; dy=-dy; p=2*dx-dy; /*注意此时误差的*/ const1=2*dx; /*变化参数取值. */ const2=2*(dx-dy); x=x1; y=y1; set_pixel (x, y, c);,while (yy2) y+; if(p0) p+=const1; else x+=inc; p+=const2; set_pixel (x, y, c); ,代码:else whi
17、le (yy2),总结,前面所介绍的逐点比较法、数值微分法以及Bresenham算法,都是一种单点生成直线的的算法。它们各有优缺点,因此在使用不同的图形输出设备时要选用最适合于该设备的方法,如在绘图仪中多采用逐点比较法,在点迹技术的显示设备中多用DDA法和Bresenham算法。,总结 前面所介绍的逐点比较法、数值微分法以及,单点生成直线的算法已经没有优化的余地,比如bresenham算法,其计算量主要体现在主循环上,没有再减少的余地。每计算一个点的计算量有:循环语句所需的一次结束判断。每个点都要进行判断,然后确定是否到了线段的结束。对x和y坐标进行的加法,1+min(dx,dy)/max(d
18、x,dy)次。对 的一次加法和一次比较操作。但是对于单点生成来说,这已经是最少计算量的算法了,一个点要花费的计算量是2+min(dx,dy)/max(dx,dy)次加法和2次比较而已。,单点生成直线的算法已经没有优化的余地比如bresenham算,双点bresenham画线算法,双点的画线绘制,每次决定两个点,因而效率大约提高了一倍。我们先考虑第一象限的情况。这时会出现四种模式,如图所示:,1,2,3,4,当m= 1/2时,1的情况不会出现。而当m=1/2时,4的情况不是出现。,双点bresenham画线算法双点的画线绘制,每次决定两个点,算法:,0=0,则采用模式2或者3,并且进一步判断为,
19、如果,Fi2*y,则选择用模式2,否则,选择3模式。,1/2=0,则采用模式4,并且(2)如果Fi0,则采用模式2或者3,并且进一步判断为,如果,Fi2*(y-x),则选择用模式2,否则,选择3模式。,算法:0=m=1/2时,初始判别式1/2=m=1时,,圆,圆也是图形系统中常用的元素。我们将圆定义为所以距离中心位置 为给定值r的点集。圆的方程为:,利用这个方程,我们可以沿x轴,从到 以单位步长计算对应的y值,从而得到圆周上每点的位置。,圆 圆也是图形系统中常用的元素。我们将圆定义为利用这个,但这样做,由于有乘方和平方根运算,并且都是浮点运算,算法效率不高。而且这样求出的圆周上的点是不均匀的;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 光栅 图形 算法 课件

链接地址:https://www.31ppt.com/p-2005517.html