大家请看下面一段Bresenham的算法
我读过这种算法的其他版本,但是这个今天才看到,的确是经过改进的算法。
虽然加了注释,但是我看了半天还是不太明白,请大家帮忙解释一下。
不明白的地方我会加括号指明。
先谢谢了!
两端点x1,y1  x2,y2
//两端点间的水平偏移量和垂直偏移量
int nDx = x2 - x1;
int nDy = y2 - y1; //两端点间的水平距离和垂直距离
int nIx = ABS(nDx);
int nIy = ABS(nDy);(((这两行不太明白,为什么要用绝对值呢) //描点步数(增量总值)
int nInc = MAX(nIx,nIy); //直线当前点的颜色
if(nInc < 2) return; //结束
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
//用于判断是否在nJudgeX,nJudgeY方向上向前进
int nJudgeX = -nIy, nJudgeY = -nIx;
//通过增量计算得到的当前点
int x = x1, y = y1;
//开始进行增量计算
//采用Bresenham算法.在这里,我们将算法进行改进,
//使其对于任意斜率的直线都能绘制,而且绘制方向始终为从起点绘制到终点
//与Windows相对应,该算法也不包含最后一个点(x2,y2)
nInc--;
//注意,整数乘2在计算机中采用移位实现
//Bresenham算法
int nTwoIx = 2 * nIx, nTwoIy = 2 * nIy;(这个地方为什么也要用绝对值呢)
//开始增量计算
for(int i = 0;i < nInc; i++)
{
nJudgeX += nTwoIx;
nJudgeY += nTwoIy;(这两行也不明白) //通过增量法计算的当前点是否属于直线上的点
BOOL bPlot = FALSE; //检测 nJudgeX 方向
if(nJudgeX >= 0)(为什么要用这个判断?它代表什么?不是用误差来判断吗)
{
bPlot = TRUE;(这个是做什么的)
nJudgeX -= nTwoIy;(这是什么意思?) //将任意走向的直线统一起来
if(nDx > 0)x++;
else if(nDx < 0)x--;
}
//检测 nJudgeY 方向
if(nJudgeY >= 0)
{
bPlot = TRUE;
nJudgeY -= nTwoIx; //将任意走向的直线统一起来
if(nDy > 0)y++;
else if(nDy < 0)y--;
}
                 if(bPlot)(这个变量是干吗的呢?)
{
SetPixel(x, y); 
}
}//end if
}//end for
当nJudgeY,nJudgeX都小于0的时候不是不能画了?一般在开始的时候要计算是沿X增加还是沿着Y增加,为什么这个没有呢?请指教,请注意在程序中有些不明白的地方我加了括号
大家恢复的时候可以也在那地方写,这样可以看的清楚点。谢谢