直线的生成算法 BresenHam
线条绘制算法是一种用于在离散视觉媒体上显示线段的方法
设直线的从起点x1,y1到终点x2,y2,直线可以表示方程y=kx+b
假定直线的点是位于第一象限,并且斜率是大于 0 小于 1 的,这这种情况下,当直线光栅化时,x每次都是自增 1,而相应的y的增量是小于 1 的,为了光栅化,当xi增加 1 时,y 只能是yi或者yi+1两个位置之一
yi或者yi+1的位置选择的原则是有精确值y与yi和yi+1的距离d1和d2的大小而定的,计算公式如下
y=kxi+1+bd1=y−yid2=yi+1−y
如果d1−d2>0,则选择yi+1, 否则选择yi,因此算法的关键在与简便的求出d1−d2的符号,
d1−d2=2y−2yi−1=2mxi+1−2yi+2b−11
m=x2−x1y2−y12
令Δx=x2−x1, Δy=y2−y1
将2式带入1式
Δxd1−d2=2xiΔy−2yiΔx+2Δy+Δx2b−13
由于已经假定直线的 2 个端点都是在第一象限,并且斜率是大于 0 小于 1 的,所以Δx大于 0,因此Δxd1−d2依然可以用作符号判断
令Pi=Δxd1−d2
则 3 式表示为
Pi=2xiΔy−2yiΔx+2Δy+Δx2b−14
Pi+1=2xi+1Δy−2yi+1Δx+2Δy+Δx2b−1
Pi+1−Pi=2Δy−2Δxyi+1−yi5
综合所述,针对上述条件下的直线 BresenHam 算法思想如下
- 绘制第一个点 计算Δx,Δy,P0=2Δy−1
- 求下个位置xi+1=xi+1若Pi>0则取yi+1否则yi
- 绘制
- 求下一个误差,若Pi>0则取Pi+1=Pi+2Δy−2Δx否则Pi+1=Pi+2Δy
- 判断是否需要终止,否则执行2、3、4
当斜率的绝对值大于1时,将x和y,dx,dy进行对换
代码实现
请参考直线的生成算法_BresenHam