1、数值微分法(Digital Differential Analyzer,简称DDA)
---一种直接从直线的微分方程生成直线的方法。
通过给定两点坐标,可以算出对应的斜率。
如斜率小于1,则代表直线在x方向的变化率比y方向的变化率大。则选定x轴为最大位移方向,同理大于1则选择y轴为最大位移方向。假若在斜率小于1时,选定y方向作为最大位移方向,当y走1步,x的值可能变化了很多,可以想象直线接近于x轴的特殊情况。
算出来的点可能时小数,可以通过四舍五入去取得整数。
算法特点:
在一个迭代算法中,如果每一步的x,y值是用前一步的值加上一个增量来获得的,那么,这种算法就称为增量算法。因此,DDA算法是一个增量算法。
优点:DDA算法直观、易实现
缺点:有浮点数和浮点运算,效率不高
代码实现:
#include
2、中点Bresenham算法
通过给定两点的坐标可以算出直线的斜截式方程:y=kx+b。也就可以写成隐式方程:
F(x,y)=y-kx-b=0
当F(x,y)>0,说明这个点在直线上方
当F(x,y)=0,说明这个点在直线上
当F(x,y)<0,说明这个点在直线上下方
若将中点M带入隐式方程,若大于0,则代表重点在直线上方,也就说明直线更加偏向于下方的pd点,反之则偏向于pu点,若等于0,随便取上下都行。
将中点带入隐式方程(构造判别式)后:
因为考虑的只是d的正负,所以可以将d扩大一定的倍数,使其成为一个整数
d0=0.5-k d<0 : d = d+1-k d>0 : d = d-k
此时,d是整数,这样就可以减轻我们的计算机,加快速度。
3、改进的Bresenham算法
代码实现:
#include
如有错误之处,欢迎大家指正,同时也欢迎大家一起交流。