计算机演示文稿教学实例课件,计算机图形学的教学演示文稿ppt课件.ppt

《计算机图形学的教学演示文稿ppt课件.ppt》由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关《计算机图形学的教学演示文稿ppt课件.ppt》文档请在天天文库搜索。

1、第二讲 基本图形的生成算法2.1 直线的生成算法2.2 圆的生成算法本章重点直线的2种生成算法及其原理圆的基本生成算法及其原理本章难点直线Bresenham算法原理及其实现圆的正负法及其实现2.1 直线的生成算法  画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的像素序列,并填入色彩数据的过程。这过程也称为直线光栅化。`连续性粗细、亮度要均匀像素逼近待画直线速度常见算法: 逐点比较法 (绘图仪画直线) DDA算法 Bresenham算法图2.1 直线段扫描转换 假定直线的起点、终点分别为:(x0,y0), (x1,y1),且都为整数。数值微分法(DDA)栅格交点表示象素点位置。。。。数值微分法(DDA)基本思想已知过端点P0 (x0, y0), P1(x1, y1)的直线段Ly=kx+b k ≤1 (x ≥ y)直线斜率为令 xi+1 = xi + 。

2、x 则 yi+1= kxi+1+b = kxi+kx +b= (kxi+b)+kx = yi+kx 当x =1时 yi+1 = yi+k 数值微分法(DDA)即:当x每递增1,y递增k(即直线斜率);注意上述分析的算法仅适用于k ≤1的情形。在这种情况下,x每增加1,y最多增加1。当 k 1时,必须把x,y地位互换这种方法直观,但效率太低,因为每一步需要一次浮点乘法和一次舍入运算。 。。。。数值微分法(DDA)例:画直线段P0(0,0)--P1(5,2) k=0.4xi round(yi) yi+10 0 0+0.41 0 0.4+0.42 1 0.8+0.4 3 1 1.2+0.44 2 1.6+0.45 2 2.0+0.4原型:void dda_line(int x0, int y0, int x1, int y1, int color);{ 利用putpixel(。

3、点的坐标,颜色) }调用dda_line(起点,终点,颜色)直线DDA算法x=x0;y=y0;for(i=1;iabs(dy)) length=abs(dx);else length=abs(dy);xincre=(float)dx/(float)length;yincre=(float)dy/(float)length; 算法描述如下:dda_line(int x0, int y0, int x1, int y1, int color){ int dx, dy, length, i; float xincre, yincre, x, y;直线DDA算法问题:当直线不在第一象限?第三象限?第二、四象限( △x 与△y符号相反 )?  综合考虑,按照从(x1, y1)到(x2, y2)方向不同,分8个象限(图2.1)。对于方向在第1a象限内的直线而言,取增量值Dx=1,Dy=m。对于方向在第。

4、1b象限内的直线而言,取增量值Dy=1,Dx=1/m。图2.3 直线方向的8个象限 象 限   |dx>dy?   Dx   Dy1a true 1   m1b false 1/m 12a true -1 m2b false -1/m 13a true -1 -m3b false -1/m -14a true 1 -m4b false 1/m -1表2.1 8个象限中的坐标增量值直线DDA算法DDA算法缺点X,Y用float, 并四舍五入,不利于硬件实现直线Bresenham算法 本算法由Bresenham在1965年提出。 设直线从起点(x1, y1)到终点(x2, y2)。则: 直线可表示为方程y=kx+b。其中 b = y1 - k * x1, k = (y2-y1)/(x2-x1)= y/ x直线Bresenham算法我们首先讨论直线斜率k∈[0,1]且x2>。

5、x1的情况(1a象限)。根据DDA算法的讨论有:xi+1=xi+1 (1)yi+1=yi+k (2)即在1a象限里,当直线光栅化时,x每次都增加1个单元:xi+1=xi+1。现在讨论y的取值。直线Bresenham算法由于k不一定是整数,因此由(2)式求出的y也不一定是整数。所以要用最靠近y的整数yi来代替y。假设直线上第i个像素坐标为(xi,yi),那么,它的下一个点的像素点的可能位置为(xi+1,yi)或(xi+1,yi+1),如图。直线Bresenham算法 由上图可知,在x=xi+1处,直线上y的值y=k(xi+1)+b,该点距离(xi+1,yi)和点(xi+1,yi+1)的距离分别为d1和d2:d1=y-yi =k(xi+1)+b-yi (3)d2=(yi+1)-y=(yi+1)-k(xi+1)-b (4) 因此,这两个距离的差为:d1-d2=2k(xi+1)-2yi+2b-1 。

6、(5)直线Bresenham算法根据(5)式,作如下讨论分析: 当此值为正时,说明直线上的理论点距离(xi+1,yi+1)较近,因此下一个直线像素点应取(xi+1,yi+1); 当此值为负时,说明直线上的理论点距离(xi+1,yi)较近,因此下一个直线像素点应取(xi+1,yi); 当此值为零时,说明直线上的理论点距离上、下两个像素点的距离相等,因此规定取(xi+1,yi)作为下一个直线像素点。直线Bresenham算法 因此,利用(d1-d2)的符号就可以决定下一个像素点的选择。然而含有变量xi、yi,不利于计算。为此,我们构造一个新的判别式:pi= x *(d1-d2)=2 xiy-2yix +c (6)其中:x=(x2-x1)>0,因此pi与(d1-d2)符号相同; y=y2-y1; 常数c=2y+x(2b-1) 下一步要做的工作是对判别式(6)进行化简,以得到递。

7、推公式。直线Bresenham算法① 以i+1代入式(6)中的i ,得:pi+1= x *(d1-d2)=2 xi+1y-2yi+1x +c (7)② 将式(7)减去式(6),并由xi+1=xi+1可得:pi+1=pi+2y-2x (yi+1-yi) (8)③ 假设直线上的初始端点恰好是其像素点的坐标,则将将x1, y1,和b代入式(6)中的xi, yi可到pi的初始值p1=2y-x (9)直线Bresenham算法 利用上面构造的误差判别变量,可得第1a象限内的直线Bresenham算法: p1=2y-x xi+1=xi+1 yi+1=yi+1, pi+1=pi+2(y-x) 当pi≥ 0时 yi+1=yi, pi+1=pi+2y 当pi0 则 yi+1=yi+1; 否则 yi+1=yi;4、画点(xi+1, yi+1);5、求下一个误差Pi+1; if Pi&g。

8、t;0 则 Pi+1=Pi+2y-2x; 否则 Pi+1=Pi+2y ;6、i=i+1; if ix1的情况(1a象限) 。现在我们来讨论如何让该算法实现任何方向线段的绘制。如图所示,线段的方向可分为8种,从原点出发射向8个区。当直线斜率的绝对值大于1时,让y坐标每次增加1,再用Bresenham的误差判别式确定x坐标是否需要增加1。请考虑如何编写适用于8个方向的直线生成的程序。象限取值1a、2ayi+1 = yi 或 yi+13a、4ayi+1 = yi 或 yi-11b、2bxi+1 = xi 或 xi+13b、4bxi+1 = xi 或 xi-1Bresenham算法的优点如下:⒈ 不必计算直线的斜率,因此不做除法。⒉ 不用浮点数,只用整数。⒊ 只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。Bresenham算法的运算速度很快,并适于用硬件实现。直线Bresenha。

9、m算法2.2 圆的生成算法  给出圆心坐标(xc, yc)和半径r,逐点画出一个圆周的公式有下列两种:⒈ 直角坐标法      (xxc)2 + (yyc)2 = r2由上式导出:       当xxc从r到r作加1递增时,就可以求出对应的圆周点的y坐标。但由于有乘方和平方根运算,且都是浮点运算,算法效率不高。 同时,这样求出的圆周上的点是不均匀的,xxc接近R时,由于圆的斜率趋向于无穷大,使得圆周上有较大的间隙。因此,所生成的圆不美观。⒈ 直角坐标法假设圆周上一点(x,y)处的半径与x轴的夹角为θ,则圆的极坐标方程为: x = xc + r · cosθ, y = yc + r · sinθ 利用圆周上点的对称性,我们可求出圆上各点,此时自变量θ的取值范围是[0,45o]。该方法涉及三角函数计算和乘法运算,计算量较大,也不是一种有效的方法。以上两种:简单直观,但计算量大,效。

10、率低 图2.3 圆心在(0, 0)点圆周   生成时的对称变换⒉ 极坐标法3.生成圆弧的正负法 原理: 设圆的方程为F(x,y)=X2 + Y2 - R2=0;假设圆心是(0,0),求得Pi的坐标为(xi,yi); 则 当Pi在圆内时-> F(xi,yi) 向右-> 向圆外 Pi在圆外时-> F(xi,yi)>0 -> 向下-> 向圆内3.生成圆弧的正负法即求得Pi点后选择下一个象素点Pi+1的规则为:当F(xi,yi) ≤0 取xi+1 = xi+1,yi+1 = yi;当F(xi,yi) >0 取xi+1 = xi, yi+1 = yi - 1;这样用于表示圆弧的点均在圆弧附近,且使F(xi,yi) 时正时负,故称正负法。快速计算的关键是F(xi,yi) 的计算,能否采用增量算法?3.生成圆弧的正负法若F(xi,yi) 已知,圆心为(0,0),计算F(xi+1,yi+1) 可分两种情况: 1、F(xi,yi)≤0-> xi+1 = xi+1,yi+1 = yi; -> F(xi+1,yi+1)= (xi+1 )2 +(yi+1 )2 -R2 -> = (xi+1)2+ yi2 -R2 = F(xi,yi) +2xi +12、 F(xi,yi)>0-> xi+1 = xi,yi+1 = yi -1; -> F(xi+1,yi+1)= (xi+1 )2 +(yi+1 )2 -R2 -> = xi2+(yi –1)2-R2 = F(xi,yi) - 2yi +1小结本章重点讲解了直线的两种生成算法:DDA算法及Bresenham算法;同时着重介绍了圆的正负生成算法,这些都是计算机图形学里面基本的、重要的算法。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值