分享

中点画线算法

 勤奋不止 2012-03-12

2.1 直线段的扫描转换算法

  中点画线法

    假定直线斜率k在0~1之间,当前象素点为xp,yp,则下一个象素点有两种可选择点P1xp+1,ypP2xp+1,yp+1)。若P1P2的中点(xp+1,yp+0.5)称为MQ为理想直线与x=xp+1垂线的交点。当MQ的下方时,则取P2应为下一个象素点;当MQ的上方时,则取P1为下一个象素点。这就是中点画线法的基本原理。

  图2.1.2 中点画线法每步迭代涉及的象素和中点示意图

     下面讨论中点画线法的实现。过点(x0,y0)、(x1, y1)的直线段L方程式为F(x, y)=ax+by+c=0,其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0欲判断中点MQ点的上方还是下方,只要把M代入Fxy),并判断它的符号即可。为此,我们构造判别式:

d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c

     当d<0时,ML(Q)下方,取P2为下一个象素;

     当d>0时,ML(Q)上方,取P1为下一个象素;

     当d=0,选P1P2均可,约定取P1为下一个象素;

注意到dxp, yp的线性函数,可采用增量计算,提高运算效率。

    若当前象素处于d30情况,则取正右方象素P1(xp+1, yp),要判下一个象素位置,应计算 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a,增量为a

    若d<0时,则取右上方象素P2(xp+1, yp+1)。要判断再下一象素,则要计算d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ,增量为ab画线从(x0, y0)开始,d的初值 d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b  F(x0, y0)=0,所以d0=a+0.5b

    由于我们使用的只是d的符号,而且d的增量都是整数,只是初始值包含小数。因此,我们可以用2d代替d来摆脱小数,写出仅包含整数运算的算法程序。

中点画线算法程序

void Midpoint Line (int x0,int y0,int x1, int y1,int color)

{ int a, b, d1, d2, d, x, y;

  a=y0-y1; b=x1-x0;d=2*a+b;

  d1=2*a;d2=2* (a+b);

  x=x0;y=y0;

  drawpixel(x, y, color);

  while (x<x1)

  { if (d<0)   {x++;y++; d+=d2; }

    else      {x++; d+=d1;}

    drawpixel (x, y, color);

  } /* while */

} /* mid PointLine */

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

a=y0-y1=-2; b=x1-x0=5; d0=2*a+b=1;d1=2*a=-4;d2=2*(a+b)=6 ,

x y   d

0 0   1

1 0   -3

2 1   3

3 1   -1        

4 2    5                                    图2.1.3 中点画线法

5 2   15

问题1:若上述算法往下取二步(Di=2),则算法和象素的取法将变成怎样?

问题2:与DDA法相比,中点法的优点是什么?

页首

动画演示:中点画线算法

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多