中点画线算法详解

中点画线算法

一、原理

已知直线的一般式方程:

F ( x , y ) = 0 F(x,y)=0 F(x,y)=0, 即 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0

其中:

  • A = − ( Δ y ) A=-(\Delta y) A=(Δy)
  • B = ( Δ x ) B=(\Delta x) B=(Δx)
  • C = − B ( Δ x ) C=-B(\Delta x) C=B(Δx)

如图:

代入m,当 x m , y m x_m,y_m xm,ym取不同值时,函数 F ( x m , y m ) F(x_m,y_m) F(xm,ym)的取值可以分三种情况,

  • F ( x m , y m ) = 0 F(x_m,y_m)=0 F(xm,ym)=0,m点在直线上
  • F ( x m , y m ) < 0 F(x_m,y_m)<0 F(xm,ym)<0,m点在直线下方
  • F ( x m , y m ) > 0 F(x_m,y_m)>0 F(xm,ym)>0,m点在直线上方

二、推导

  1. 0 ≤ ∣ k ∣ ≤ 1 0\le |k|\le 1 0k1来讨论:

    如图:

    可以看出每次在x方向上加1,y方向上加1或不变需要判断。

  2. 通过仔细观察,发现:

    • 当M在Q的下方时,则 P u P_u Pu 离直线近,应为下一个象素点;

    • 当M在Q的上方,应取 P d P_d Pd 为下一点。

  3. 利用中点画线的基本原理

    将M带入代入理想直线方程,可得
    F ( x m , y m ) = A x m + B y m + C F(x_m,y_m)=Ax_m+By_m+C F(xm,ym)=Axm+Bym+C
    d i = F ( x m , y m ) d_i=F(x_m,y_m) di=F(xm,ym)

    则有: d i = F ( x i + 1 , y i + 0.5 ) = A ( x i + 1 ) + B ( y i + 0.5 ) + C d_i=F(x_i+1,y_i+0.5)=A(x_i+1)+B(y_i+0.5)+C di=F(xi+1,yi+0.5)=A(xi+1)+B(yi+0.5)+C

    有三种情况:

    • 当d = 0 时: M在直线上,选 p d p_d pd p u p_u pu均可;
    • 当d > 0 时: M在Q上方,应取 p d p_d pd
    • 当d < 0 时: M在Q下方,应取 p u p_u pu

    d的值决定了y的值:

    d i = A ( x i + 1 ) + B ( y i + 0.5 ) + C d_i=A(x_i+1)+B(y_i+0.5)+C di=A(xi+1)+B(yi+0.5)+C

y i + 1 = { y i + 1 , ( d i < 0 ) y i , ( d i ≥ 0 ) y_{i+1}=\begin{cases} y_i+1, & (d_i<0)\\ y_i, & (d_i\ge 0) \end{cases} yi+1={yi+1,yi,(di<0)(di0)

三、优化

  1. 分析计算量

    为了求出d值,需要两个乘法,四个加法,且有浮点数运算。

  2. 提高运算效率

    因为d是x,y的线性函数,采用增量计算是可行的。

    d i + 1 = d i + 增 量 d_{i+1}=d_i + 增量 di+1=di+

  3. 计算增量

    • 计算 d 0 d_0 d0

      d 0 = F ( x M 0 , y M 0 ) d_0=F(x_{M_0},y_{M_0}) d0=F(xM0,yM0)

      = F ( x i , y i + 0.5 ) = F(x_i,y_i+0.5) =F(xi,yi+0.5)

      = A ( x i + 1 ) + B ( y i + 0.5 ) + C = A(x_i+1)+B(y_i+0.5)+C =A(xi+1)+B(yi+0.5)+C

    • 计算 d 1 d_1 d1

      如图:

      d 1 = F ( x M 1 , y M 1 ) d_1=F(x_{M_1},y_{M_1}) d1=F(xM1,yM1)

      = F ( x i + 2 , y i + 1.5 ) = F(x_i+2,y_i+1.5) =F(xi+2,yi+1.5)

      = A ( x i + 2 ) + B ( y i + 1.5 ) + C =A(x_i+2)+B(y_i+1.5)+C =A(xi+2)+B(yi+1.5)+C

      = A ( x i + 1 ) + B ( y i + 0.5 ) + C + A + B =A(x_i+1)+B(y_i+0.5)+C+A+B =A(xi+1)+B(yi+0.5)+C+A+B

      = d 0 + A + B =d_0+A+B =d0+A+B

    • 计算 d 2 d_2 d2

      如图:

      d 2 = F ( x M 2 , y M 2 ) d_2=F(x_{M_2},y_{M_2}) d2=F(xM2,yM2)

      = F ( x i + 2 , y i + 0.5 ) = F(x_i+2,y_i+0.5) =F(xi+2,yi+0.5)

      = A ( x i + 2 ) + B ( y i + 0.5 ) + C =A(x_i+2)+B(y_i+0.5)+C =A(xi+2)+B(yi+0.5)+C

      = A ( x i + 1 ) + B ( y i + 0.5 ) + C + A =A(x_i+1)+B(y_i+0.5)+C+A =A(xi+1)+B(yi+0.5)+C+A

      = d 0 + A =d_0+A =d0+A

    • 计算d的初始值 d 0 d_0 d0

      因为直线的第一个像素 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)在直线上,即 A ( x 0 ) + B ( y 0 ) + C = 0 A(x_0)+B(y_0)+C=0 A(x0)+B(y0)+C=0,因此相应的d的初始值计算如下:

      d 0 = F ( x 0 , y 0 + 0.5 ) d_0=F(x_0,y_0+0.5) d0=F(x0,y0+0.5)

      = A ( x 0 + 1 ) + B ( y 0 + 0.5 ) + C = A(x_0+1)+B(y_0+0.5)+C =A(x0+1)+B(y0+0.5)+C

      = A ( x 0 ) + B ( y 0 ) + C + A + 0.5 B =A(x_0)+B(y_0)+C+A+0.5B =A(x0)+B(y0)+C+A+0.5B

      = A + 0.5 B =A+0.5B =A+0.5B

    • 综上可得:
      d 0 = A + 0.5 B d_0=A+0.5B d0=A+0.5B

d i + 1 = { d i + A + B , ( d i < 0 ) d i + A , ( d i ≥ 0 ) d_{i+1}=\begin{cases} d_i+A+B, & (d_i<0)\\ d_i+A, & (d_i\ge 0) \end{cases} di+1={di+A+B,di+A,(di<0)(di0)

至此,中点算法至少可以和DDA算法一样好。

  1. 摆脱浮点运算

    用2d代替d来摆脱浮点运算,写出仅包含整数运算的算法。这样,中点生成直线的算法提高到整数加法,优于DDA算法。

    即:

d i + 1 = { d i + 2 ( A + B ) , ( d i < 0 ) d i + 2 A , ( d i ≥ 0 ) d_{i+1}=\begin{cases} d_i+2(A+B), & (d_i<0)\\ d_i+2A, & (d_i\ge 0) \end{cases} di+1={di+2(A+B),di+2A,(di<0)(di0)
d 0 = 2 A + B d_0=2A+B d0=2A+B

  • 10
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值