上次写了一下DDA直线算法的过程和实现,但DDA算法也有一些缺点:
主要它涉及到了实数的除法运算,效率不太高。
今天,我介绍另外一种画直线的算法:Bresenham算法(中点画线)
Bresenham算法的基本思想就是一步一步生成直线上的结点,可以说是生成式算法。它的优点就在于整个算法过程中全是整数运算,没有实数运算。
首先假设直线的k(斜率)是 0<k<1 ,如上图所示,可以看到直线的起点是 (x1,y1) 终点是 (x2,y2) 。现在的状态是我当前点位于 (xp,yp) ,目标是计算出下一个应该画的节点,从图中可以看到,下一个点不是 P1 就是 P2 ,那怎么确定呢?很显然我们只需要计算 P1 P2 的中点 M 在直线的上侧还是下侧,如果在上侧就选 P2 ,如果在下侧就选 P1 。这样就计算得出了下一个将要画的点,然后重复上述计算过程,一个点一个点的计算出来,将直线画出。
上面只是简单描述了一下算法的思想,具体实现过程还有一些事情需要处理:
1、构造一个判别式
F(x,y)=ax+by+c ,用于计算点到直线的距离。将起点和终点代入判别式,可以得出其参数 a=y1−