无数次的把这个算法忘掉,还是重新记录一下的好
通过斜截式y=dy/dx+B 其中dy=y1-y0, dx=x1-x0, 导出直线隐式函数F(x,y)=dy*x-dx*y+dx*B=0
可知对直线下方的点F(x,y)为正,直线上方的点为负
对下一步将要选择的垂直方向上相邻的两像素NE与E,其中点为M,当前选择了的像素坐标为(xp,yp)
则M为F(xp+1,yp+1/2),只需判断此函数的符号即可决定选择NE或者E
设判定变量d=F(xp+1,yp+1/2), d>0时选择下方像素E,d<0时选择上方像素NE,d=0时皆可
现考察d的变化方式,根据本次的选择NE还是E而不同
1)选择E时,M沿x方向上递增一步
dnew=F(xp+2,yp+1/2)
dold=F(xp+1,yp+1/2)
所以dnew=dold+dy
2)选择NE时,M沿x和y方向上都递增一步
dnew=F(xp+2,yp+3/2)
dold=F(xp+1,yp+1/2)
所以dnew=dold+dy-dx
d的初始值:dstart=F(x0+1,y0+1/2)=dy-dx/2
为消除d的小数,需消除除法运算,将F(x,y)乘以2,即F(x,y)=2(dy*x-dx*y+dx*B) 于是所有的增量同样乘以2,即2dy和2(dy-dx)不影响结果