Bresenham算法

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)

转载于:https://www.cnblogs.com/cnblog-wuran/p/9677334.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值