计算机图形学基本光栅图形算法.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《计算机图形学基本光栅图形算法.ppt》由会员分享,可在线阅读,更多相关《计算机图形学基本光栅图形算法.ppt(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本章内容本章内容3.1 3.1 用用JavaJava语言绘图语言绘图13.2 3.2 直线的扫描转换直线的扫描转换23.3 3.3 圆的扫描转换圆的扫描转换33.4 3.4 多边形的扫描转换多边形的扫描转换43.5 3.5 区域填充区域填充53.6 3.6 字符的生成字符的生成63.7 3.7 光栅图形的反走样算法光栅图形的反走样算法73.2 3.2 直线的扫描转换直线的扫描转换 图形图像是由屏幕上不同亮度不同颜色的光点图形图像是由屏幕上不同亮度不同颜色的光点(像素)组成。在光栅显示器的荧光屏上生成一(像素)组成。在光栅显示器的荧光屏上生成一个对象,实质上是个对象,实质上是往帧缓存寄存器的相应
2、单元中往帧缓存寄存器的相应单元中填入数据填入数据。所以所以 对对直线直线进行进行光栅化光栅化的时候,只能在显示器所给的时候,只能在显示器所给定的有限个像素组成的点阵中确定定的有限个像素组成的点阵中确定最佳逼近于该最佳逼近于该直线的一组像素直线的一组像素,用这些像素表示该直线。,用这些像素表示该直线。所以所以 生成直线的主要工作是:生成直线的主要工作是:快速找出快速找出距离直线最距离直线最近的网格点近的网格点,用这些网格点对应的像素表示该直,用这些网格点对应的像素表示该直线。线。3像素逼近直线示意图像素逼近直线示意图图像元素图像元素可寻址点可寻址点43.2.1 3.2.1 基本增量算法基本增量算
3、法 设直线设直线 满足满足 ,由于直线的斜,由于直线的斜率小于等于率小于等于1 1,所以,该直线的扫描转换可从最左端开,所以,该直线的扫描转换可从最左端开始,始,每次递增一个单位,对每个每次递增一个单位,对每个 ,相应的有,相应的有 ,则,则 所以,所以,每增加一个单位,每增加一个单位,只需加上一个只需加上一个 ,这样,这样就去掉了乘法运算,提高了算法效率。在该算法中,就去掉了乘法运算,提高了算法效率。在该算法中,直直线上的所有点的线上的所有点的 和和 值可由前一点的值加一个基本增值可由前一点的值加一个基本增量得到量得到,所以该算法称为,所以该算法称为基本增量算法基本增量算法。3.2.1 基本
4、增量算法基本增量算法(DDA-digital differential (DDA-digital differential analyzer)analyzer)1、基本思想:、基本思想:53.2.1 3.2.1 基本增量算法基本增量算法注:注:上述讨论只适合上述讨论只适合 的情况,当的情况,当 时,只需将时,只需将 和和 的角色的角色互换互换,即,即 每每次增加一个单位,次增加一个单位,每次增加每次增加 。基本增量算法也叫基本增量算法也叫数字微分分析器算法数字微分分析器算法(Digital Differential Analyzer,DDA)。)。DDA是是用数值方法求解微分方程的一种设备,即
5、根据用数值方法求解微分方程的一种设备,即根据 111和和 的一阶导数,在的一阶导数,在 和和 方向上渐进地以小步方向上渐进地以小步长移动,由此产生连续的像素坐标长移动,由此产生连续的像素坐标 。6 2、直线的表示:直线的表示:设直线的起点坐标为设直线的起点坐标为(xs,ys),终点坐标为终点坐标为(xe,ye),令令xxe-xs,y ye-ys,则,则直线参数直线参数方程方程为为v目标:能快速地求出能很好地表示直线的目标:能快速地求出能很好地表示直线的像素像素第第 步时步时(3.1)73 3、提高速度的方法:、提高速度的方法:乘法用加法乘法用加法实现,每一个点坐标都可以由前一个坐标变化一实现,
6、每一个点坐标都可以由前一个坐标变化一个个增量增量得到。得到。设设(xi,yi)是第是第i 步得的直线上的点,则直线上第个步得的直线上的点,则直线上第个i+1 点是点是(xi+1,yi+1),其中其中 当当x y0,即即直线斜率小于直线斜率小于1 1,应使,应使x x方向每次增加方向每次增加1 1,y方方向最多增加向最多增加1 1,此时取,此时取t=1/x;同理同理,当当yx0,直线斜率大于直线斜率大于1 1,取,取t=1/y,所以所以(3.2)令令 ,将参数区间,将参数区间0,1分为分为 等份,等份,即即 每次的增量为每次的增量为 。8 下图中,用公式(下图中,用公式(3.2)求得的直线)求得
7、的直线 上的上的点用空心圆表示,但显示时要用像素来表示,点用空心圆表示,但显示时要用像素来表示,即采用即采用四舍五入四舍五入的办法得到最靠近空心圆点的的办法得到最靠近空心圆点的像素,用这些像素(下图中的实心圆点)来表像素,用这些像素(下图中的实心圆点)来表示直线。示直线。图中实心圆点表示用图中实心圆点表示用DDA方法生成的直线方法生成的直线9图中黑点表示用DDA法生成的直线4 4、直线的、直线的DDA算法程序算法程序void dda(Graphics g,int x1,int x2,int y1,int y2)int k;float x,y,dx,dy;k=Math.abs(x2-x1);if
8、(Math.abs(y2-y1)k)k=Math.abs(y2-y1);dx=(float)(x2-x1)/k;dy=(float)(y2-y1)/k;/变化的增量变化的增量 x=(float)(x1);y=(float)(y1);for(int i=0;ik;i+)g.drawLine(int)(x+.5f),(int)(y+.5f),(int)(x+.5f),(int)(y+.5f);x=x+dx;y=y+dy;/end DDA 完成四舍五入完成四舍五入10实实 例例设给定直线的起点坐标为设给定直线的起点坐标为(0,0),终点坐标为终点坐标为(9,6),则上述,则上述DDA算法画出的直线如
9、下图所示。算法画出的直线如下图所示。DDA方法所画直线图方法所画直线图DDA算法缺点:算法缺点:需要进行浮点数需要进行浮点数运算,产生一个运算,产生一个像素要做两次加像素要做两次加法和两次取整运法和两次取整运算,运行效率低算,运行效率低且取整运算不利且取整运算不利于硬件实现。于硬件实现。11算法背景算法背景设直线的起点坐标为设直线的起点坐标为 ,斜率为,斜率为 。下面就。下面就 的情况来说明该算的情况来说明该算法。取法。取 为像素所在点的横坐标(整为像素所在点的横坐标(整数),令数),令 ,直线上相邻,直线上相邻两点的坐标满足关系两点的坐标满足关系(3.3)一般来说,一般来说,不一定是整数,所
10、以不一定是整数,所以 也不一定是整数,因此也不一定是整数,因此要用靠近该点最近的网格点要用靠近该点最近的网格点 来近似。由于来近似。由于取整取整计算量较大,为了提高效率,计算量较大,为了提高效率,Bresenham算法用下面的方算法用下面的方法来避免使用取整运算。法来避免使用取整运算。3.2.2 3.2.2 Bresenham算法算法12当当B在在A的下面时,的下面时,此时应取,此时应取C点作为点作为 ;当当B在在A的上面时,的上面时,则应取,则应取D点作为点作为 。BACD图图3.4 3.4 的几何意义的几何意义设图设图3.4中已得到第中已得到第 个显示的点个显示的点 ,B点是直线与第点是直
11、线与第 列列网格线的交点网格线的交点 ,则第,则第 个显个显示的点示的点 只能从只能从C或或D点点中中去选。设去选。设A为为CD边的中点,令误边的中点,令误差项差项(3.4)算法思想:算法思想:13通过递推的方式,高效地计算点序列和通过递推的方式,高效地计算点序列和 ,由图,由图3.4可得可得(3.5)由式(由式(3.3)()(3.5)可得)可得=(3.6)14注:注:式(式(3.5)和()和(3.6)是根据图)是根据图3.4所示的情况推出所示的情况推出的,容易验证,式(的,容易验证,式(3.5)和()和(3.6)对图)对图3.5所示所示的两种情况也成立。的两种情况也成立。CBADBACD图图
12、3.5 3.5 的几何意义的其他两种情况的几何意义的其他两种情况15算法的程算法的程序实现序实现由式(由式(3.3)和()和(3.4)可得)可得假设直线段起始点的坐标分假设直线段起始点的坐标分量量 和和 均为整数,则均为整数,则有有m=(double)dy/(double)dx;e=m0.5;for(i=0;i=0)y=y+1;e=e1;x=x+1;e=e+m;该算法在计算直线斜率和误差项该算法在计算直线斜率和误差项时用到了小数与除法,可改用整时用到了小数与除法,可改用整数来避免除法,以提高算法的效数来避免除法,以提高算法的效率和减少算法的复杂性。由于算率和减少算法的复杂性。由于算法中只用到误
13、差项的符号,因此法中只用到误差项的符号,因此可进行如下替换:可进行如下替换:。16改进后的改进后的算法程序算法程序void bresenham(Graphics g,int xs,int ys,int xe,int ye)int dx=xe-xs;int dy=ye-ys;int e=2*dy-dx;int x=xs;int y=ys;for(int i=0;i=0)y=y+1;e=e-2*dx;x=x+1;e=e+2*dy;注:注:上面讨论了上面讨论了 的情况,如果的情况,如果 ,则需把,则需把 和和 的地位的地位互换互换。如果。如果 或或 ,程序中,程序中 或或 需换成需换成 或或 ,同时
14、,同时 也应也应相应地改变。相应地改变。173.3 3.3 圆的圆的扫描转换扫描转换1 1、基本原理:、基本原理:假设已选取假设已选取Pi-1为第为第i-1个像素,个像素,则如果则如果Pi-1在在圆内圆内,就要,就要向圆向圆外外方向走一步,若方向走一步,若Pi-1在在圆外圆外就要就要向圆内向圆内走一步。若走一步。若Pi-1在在圆上圆上,则可以向圆内走一步,则可以向圆内走一步,也可以向圆外走。也可以向圆外走。xypiPi+1Pi-1BA(0,0)图图3.9 对圆弧对圆弧AB用正负法取点用正负法取点3.3.1 3.3.1 正负法正负法这样用于表示圆弧的点均在理想这样用于表示圆弧的点均在理想圆弧附近
15、且时正时负,因此称为圆弧附近且时正时负,因此称为正负法正负法。由于这种方法每走完一步,都要比较当前位置的。由于这种方法每走完一步,都要比较当前位置的函数值,以决定下一步的走向,因而也称为函数值,以决定下一步的走向,因而也称为逐点比较法逐点比较法。182 2、正负法的具体实现、正负法的具体实现1 1)圆的表示:设圆的圆心为)圆的表示:设圆的圆心为(0,0),半半径为径为R,则圆的方程为:则圆的方程为:F(x,y)=x2+y2R2=0 ypiPi+1Pi-1BA(0,0)图图3.9 对圆弧对圆弧AB用用正负法取点正负法取点v如何判断一个点和圆的内外关系如何判断一个点和圆的内外关系v当点当点(x,y
16、)在圆内时在圆内时,F(x,y)0;v当点当点(x,y)在圆上时,在圆上时,F(x,y)=0。192 2)实现步骤)实现步骤第第1 1步:步:x0=0,y0=R第第2 2步:步:求得求得Pi(xi,yi)后找点后找点Pi+1的原则为:的原则为:yPiBA(0,0)当当Pi在圆内在圆内时时(F(xi,yi)0),要向右走一步得要向右走一步得Pi+1,这是向圆外方这是向圆外方向走去。取向走去。取xi+1=xi+1,yi+1=yiPi+1 当当Pi在圆外在圆外时时(F(xi,yi)0),要要向向下下走走一一步步得得Pi+1,这这是是向向圆圆内内方方向走去,取向走去,取xi+1=xi,yi+1=yi-
17、1Pi+1用来表示圆弧的点均在圆弧附近且用来表示圆弧的点均在圆弧附近且 F(xi,yi)时正时负时正时负 x20当当 时,时,假设已经算出假设已经算出F(xi,yi),如何计算如何计算F(xi+1,yi+1)?由上可知由上可知 。如果。如果 的值已算出,计算的值已算出,计算 时可分为两种情况:时可分为两种情况:(3.9)当当 时,时,(3.10)由式(由式(3.9)和式)和式(3.10)知知,21算法的程算法的程序实现序实现void pnarc(Graphics g,int radius)int x,y,f;x=0;y=0+radius;f=0;while(y 0)g.drawLine(x,y
18、,x,y);if(f 0)f=f 2*y+1;y-;else f=f+2*x+1;x+;if(y=0)g.drawLine(x,y,x,y);223.3.2 3.3.2 BresenhamBresenham 算法算法 假设圆心假设圆心(0,0)为原点,为原点,考虑考虑AB弧的画法,显示一弧的画法,显示一个整圆时,只要在显示个整圆时,只要在显示AB上任一点上任一点(x,y)时,同时显时,同时显示在圆周上其它示在圆周上其它七个对称七个对称点点(y,x),(y,-x),(x,-y),(-x,-y),(-y,-x),(-y,x),(-x,y)。7 7个对称点个对称点231 1、基本原理、基本原理考虑考
19、虑AB弧段弧段,x每步增加每步增加1,从从 x=0开始开始,到到x=y结束。结束。即有:即有:xi+1=xi+1 相应的相应的yi+1则在两种则在两种 可能中选择:可能中选择:yi+1=yi,或者或者 yi+1=yi-1。所以所以 选择的原则是确定这两个点哪一选择的原则是确定这两个点哪一 个更接近于圆弧。个更接近于圆弧。Pi-1HiLi即:设即:设Pi-1是已选中的一个表示圆弧上的点,下一是已选中的一个表示圆弧上的点,下一个点应从个点应从Hi或或Li中选择。设中选择。设Hi和和Li两点的坐标分别两点的坐标分别为为(xhi,yhi)和和(xli,yli)242 2、BresenhamBresen
20、ham的具体实现的具体实现1)令令D(P)=(x2+y2)-R2,表示点表示点P到原点的距离平方与圆的半径的到原点的距离平方与圆的半径的平方之差。令:平方之差。令:当当di=0时时,点点Hi和和Li距距弧弧AB的距离相等的距离相等当当di0时,时,|D(Hi)|D(Li)|,取取Li来显示弧来显示弧AB。Pi-1HiLidi=D(Hi)+D(Li)252 2)di递推公式递推公式设已选中的点设已选中的点Pi-1=(xi-1,yi-1),则则Hi和和Li点的坐标分别点的坐标分别为为(xi,yi-1)和和(xi,yi-11),Hi+1和和Li+1的坐标分别为的坐标分别为(xi+1,yi)和和(xi
21、+1,yi 1)。因为因为 x0=0,y0=R,x1=x0+1,所以所以 d1=D(H1)+D(L1)=(12+y20-R2)+(12+(y0-1)2-R2)=3-2y0=3-2R di=(x2i+y2i-1-R2)+(x2i+(yi-1-1)2-R2)=2x2i+2y2i-1-2yi-1-2R2+1 di+1=(xi+1)2+y2i-R2+(xi+1)2+(yi-1)2-R2 =2x2i+4xi+2y2i-2yi-2R2+326 di=2x2i+2y 2i-1-2yi-1-2R2+1 (3.13)di+1=2x2i+4xi+2y2i-2yi-2R2+3 (3.14)当当 di0时时,点点 H
22、i被被 选选 中中,xi=xi-1+1,yi=yi-1,由由 (3.13)-(3.14)得得 di+1=di+4xi+2=di+4xi-1+6 (3.15)当当di0时时,点点Li被选中被选中,xi=xi-1+1,yi=yi-1-1,由由(3.13)-(3.14)得得 di+1=di+4xi-4yi-1+6=di+4(xi-1-yi-1)+10 (3.16)27算法的程算法的程序实现序实现void bresenham_arc(Graphics g,int radius)int x,y,d;x=0;y=radius;d=3-2*radius;while(x y)g.drawLine(x,y,x,
23、y);if(d0)d=d+4*x+6;else d=d+4*(x-y)+10;y-;x+;if(x=y)g.drawLine(x,y,x,y);Bresenham算法在候选的两个像素中,总是选算法在候选的两个像素中,总是选离圆弧最近离圆弧最近的像素为的像素为圆弧的一个近似点,因此,它比正负法决定的像素更合理。圆弧的一个近似点,因此,它比正负法决定的像素更合理。28基本思想基本思想按一定方式计算给定圆弧轨迹上的一系列按一定方式计算给定圆弧轨迹上的一系列顶点顶点,然后用连接相邻点的一系列然后用连接相邻点的一系列直线段直线段来逼近圆弧。来逼近圆弧。用正多边形迫近圆弧法用正多边形迫近圆弧法 设圆弧所在
24、圆的半径为设圆弧所在圆的半径为R,圆弧的起始角和终止角分别为,圆弧的起始角和终止角分别为 和和 ,把圆弧分割成把圆弧分割成 份,则相邻两个顶点之间的夹角为份,则相邻两个顶点之间的夹角为 。设。设顶点序列的第顶点序列的第 个点为个点为 ,为该点的幅角。则下为该点的幅角。则下一个顶点一个顶点 的的坐标坐标为为 或表示为或表示为矩阵形式矩阵形式3.3.3 3.3.3 圆的多边形迫近法圆的多边形迫近法29椭圆弧椭圆弧的生成的生成设椭圆的中心在原点,长短轴分别为设椭圆的中心在原点,长短轴分别为a 和和b,且平行于坐标柚,则该且平行于坐标柚,则该椭圆的参数方程椭圆的参数方程为为,设顶点序列的第设顶点序列的
25、第i个顶点为个顶点为 ,则下一个顶点则下一个顶点 的的坐标坐标应满足应满足 ,由此可得由此可得其中其中303.4.1 3.4.1 多边形的扫描转换多边形的扫描转换1 1、表示方法、表示方法:顶点表示和点阵表示:顶点表示和点阵表示1 1)顶点表示)顶点表示是用多边形的是用多边形的顶点的序列顶点的序列来描述多边形,该表示几何意义强、占来描述多边形,该表示几何意义强、占内存少,但它不能直观地说明哪些像素内存少,但它不能直观地说明哪些像素在多边形内。在多边形内。2 2)点阵表示点阵表示是用位于多边形内的是用位于多边形内的像素像素的集合的集合来描述多边形,该方法虽然没有来描述多边形,该方法虽然没有多边形
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 基本 光栅 图形 算法
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内