文档介绍:Bresenham中点画线算法
先标明这转载自 
 
 
直线扫描算法之---bresenham改进算法(任何斜的,我们要消除除法和小数:
1.       消除除法
e=e+d;
e=e+dx/dy;
dy*e=dy*e+dx;
2.
       2*dy*e=2*dy*e+2dx;
由于算法中只用到误差项的符号,所以可以使用如下替换:
e’=2*e*dy
注意:为了让代换后符号不改变,必须保证dy>0,如果不满足,则可以按上述方法交换起点终点坐标。
 
 
代码如下:
void CMyDrawLineView::DrawBresenham(int x1,int x2,int y1,int y2,COLORREF color,CDC* pDC)
{
       int x,y,dx,dy,e;
       dx=x2-x1;
       dy=y2-y1;
       x=x1;
       y=y1;
       CString s;
//这里一定要注意,由于使用的是改进算法,所以dx一定是要大于0才能保证其符号不变
       if((dx>=0&&dy>=0)||(dx<=0&&dy<=0))    //如果k大于0
       {    
                     if(dx<0)                       //dx小于0说明终点x
                     {
                            dx=-dx;
                            x=x2;
                            dy=-dy;
                            y=y2;                   
}
 
              if(dy>=dx)                                  //第一种情况,k-(0,1)
              {
                     e=-dy;
                     for(int i=0;i<dy;i++)
                     {
                            pDC->SetPixel(x,y,color);
                            y++;
                            e=e+dx+dx;
                            if(e>=0)
                            {
                                   x++;
                                   e=e-dy-dy;
                            }
                     }
              }
}
}
 
 
 
 
-(-1)之间
如图三,在这种情况下可以类比斜率在0-1之间的情况,不过呢,我们要注意一个问题,就是现在的斜率是负数,我们使用时,需要改变符号,下面直接看改进:
e=e-dy/dx(注意是减号,因为现在的斜率是负数)
e*dx=e*dx-dy
2*e*dx= 2e*dx-2dy
由于算法中只用到误差项的符号,所以可以使用如下替换:
e’=2*e*dx
注意:为了让代换后符号不变,必须保证dx>0
d
d
代码如下:
void CMyDrawLineView::DrawBresenham(int x1,int x2,int y1,int y2,COLORREF color,CDC* pDC)
{
       int x,y,dx,dy,e;
       dx=x2-x1;
       dy=y2-y1;
       x=x1;
       y=y1;
       CString s;
//这里一定要注意,由于使用的是改进算法,所以dx一定是要大于0才能保证其符号不变
       if((dx>=0&&dy>=0)||(dx<=0&&dy<=0))    //如