直线段扫描转换算法

数值微分(DDA)法

    设过端点P0(x0 ,y0)、P1(x1 ,y1)的直线段为L(P0 ,P1),则直线段L的斜率   L的起点P0的横坐标x0L的终点P1的横坐标x1步进,取步长=1(个象素),用L的直线方程y=kx+b计算相应的y坐标,并取象素点(x,round(y))作为当前点的坐标。因为:

P0 ( x0 , y0 )、 P1 ( x1 , y1 )的直线段为 L ( P0 , P1 ),则直线段 L 的斜率   L 的起点 P0 的横坐标 x0 L 的终点 P1 的横坐标 x1 步进,取步长=1(个象素),用 L 的直线方程 y=kx+b 计算相应的 y 坐标,并取象素点( x ,round( y ))作为当前点的坐标。因为:

    yi+1 = kxi+1+b

         = k1xi+b+kDx

         = yi+kDx

  所以,当Dx =1; yi+1 = yi+k。也就是说,x每递增1y递增k(即直线斜率)。根据这个原理,我们可以写出DDA画线算法程序。

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;x< x1;x++)

  { drawpixel (x, int(y+0.5), color);

       y=y+k;

  }

}

注意:我们这里用整型变量color表示象素的颜色和灰度。

举例:用DDA方法扫描转换连接两点P00,0)和P15,2)的直线段。

x int(y+0.5) y+0.5

0     0        0

1     0      0.4+0.5

2     1      0.8+0.5

3     1      1.2+0.5

4     2      1.6+0.5                          图2.1.1 直线段的扫描转换

    注意:上述分析的算法仅适用于|k| 1的情形。在这种情况下,x每增加1,y最多增加1。当 |k| > 1时,必须把xy地位互换,y每增加1x相应增加1/k。在这个算法中,yk必须用浮点数表示,而且每一步都要对y进行四舍五入后取整,这使得它不利于硬件实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值