Bresenham算法
Bresenham算法的思想主要是通过判断y+1和y+0与直线上的点的距离远近来决定下一个像素点的y值到底是y还是y+1。
设直线y=kx+b,假设我第一点为(x,y),第二点为(x+1,y2)那么第二点我通过判断y+1和y哪个距离y2更近来选择下一个像素点的位置。
设y+1与y2的距离为D1,y与y2的距离为D2。
D1=y+1-y2=y+1-k(x+1)-b;
D2=y2-y=k(x+1)+b-y
我们通过判断D2-D1的符号来判断哪个距离更近
D2-D1=k(x+1)+b-y-(y+1-k(x+1)+b)
=2k(x+1)+2b-2y-1
通过判断这个式子的符号即可知道我们要取哪个值。但现在有一问题,就是这个式子中出现了k,k不是一个整数。
为了去掉k,我们可以通过把这个式子乘上▲x(k=▲y/▲x),而且设k为正数,即▲x为正)
p=▲x(D2-D1)=2▲y*x-2▲x*y+c (c=2▲y+▲x(2b-1),是一个常量)
通过判断p的符号我们即可选择绘制y+1还是y。
使用增量思想
为了减少运算,我们使用增量思想,通过pi把pi+1推导出来
pi+1=2▲y(x+1)-2▲x*yi+1+c
pi=2▲y*x-2▲x*yi+c
pi+1=pi+2▲y-2▲x(yi+1-yi)
其中yi+1-yi是0或1,根据pi的符号来确定。
p0=2▲y*x0-2▲x((▲y/▲x)(x0+b))+2▲y+▲x(2b-1)
=2▲y-▲x
最后算法步骤如下:
- 1.输入端点
- 2.画出第一个点
- 3.计算常量▲x,▲y,p0=2▲y-▲x
- 4.判断p的符号,如果p<0
绘制点(x+1,y)
pnext=p+2▲y
否则,绘制点(x+1,y+1)
pnext=p+2▲y-2▲x - 5.重复第四步,共▲x-1次
讨论k值其他情况
关于▲x和▲y的问题
补充说明:
我们可以注意到,▲x是必定大于0的(因为我们总是用右边的点减左边的点
而▲y则不一定,当|k|<1时不需要处理,因为都是乘以▲x,但是当|k|>1时要注意,k为负数时要改为乘以-▲y
当-1<k<0时
推导过程如下:
结论:
p0=-▲x-2▲y
pi+1=pi-2▲y-2▲x(yi+1-yi)
当1<k时
推导过程如下:
结论:
p0=2▲x-▲y
pi+1=pi+2▲x-2▲y(xi+1-xi)
当<k<-1时
推导过程如下:
修改:应该从y0开始,每次-1.
结论:
p0=2▲x+▲y
pi+1=pi+2▲x+2▲y(xi+1-xi)