在画布上给定起点和终点,怎么画出连接两点的直线呢?Bresenham算法给出了一种简单的方法,该算法非常精简可以只用整数加减法和位移等比较简单的算术运算方式实现。在一些计算资源比较贫乏的硬件上应用广泛。
该算法并不是通过直线方程去求解直线上的坐标点,而是通过栅格化,计算随x坐标变化后y的误差确定,这样避免了直线方程的计算。算法的思路如下:
假设直线的斜率为0到1之间(其他方向可通过直线对称性推导),起点为(x0,y0),终点为(x1, y1),则斜率为k=(y1-y0)/(x1-x0),直线方程为y-y0=k(x-x0)
1.画起点(x0,y0)。
2.准备画下一个点,x坐标增加1为x+1,那么下一个点要么是当前节点的右邻节接点(x+1,y+1),要么是右上邻接点(x+1, y),即x值每增长1,y值保持不变或增长1。计算方法为:右上邻接点和上邻接点的中点为M(xm, ym),如果直线和x=x1+1的直线交点在M上方则取右上邻接点,如果交点在M下方则取右邻接点。
3.画出下一个点。如果到达终点则结束。
其中:
直观一点的理解:x坐标增长1,则y坐标增长k,设e=e+k(e初始值为0);当e<0.5的时候,取右邻接点,否则取右上邻接点,同时e减1以保证相对性。
为了消除浮点数,在不等式两边乘以2,为了消除除法,在等式两边乘以deltax,这样更具有普适性(deltx不能为0)。
对于斜率为其他值的情况,可以通过交换轴的方向进行计算,并在画线时再旋转过来。