直线绘制算法-Bresenham算法

该算法相较于其他直线绘制算法摆脱了直线方程式的使用,通过换元的思想实现整数加法的迭代。

一.Bresenham算法

前提条件k∈[0,1],直线在x方向上每次增量为\Delta x=1,在y方向上每次的增量为\Delta y=k。通过一个变量d将y方向上的累计增量记录下来,当d大于1时,标记点m进1,并对变量d进行-1操作使得d的范围永远保持在[0,1]之间。并根据d的范围确定最终的y值,当d\leq 0.5时,则y保持不变;当d>0.5时,y加1。

上述已经能够完成y值的判定,但是存在两个问题:k可能为浮点数、d每次需要同0.5这一浮点数比较大小。由于计算机计算整数的效率比浮点数速度快,因此要对上式进行优化改进,主要通过两步换元。

1.令e=d-0.5

d_{0}=0                                           \rightarrow e_{0}=-0.5

d_{i+1}=d_{i}+k                               \rightarrowe_{i+1}=e_{i}+k

d=d-1 (d>1)                         \rightarrowe=e-1(e>0.5)

m_{0}=y_{0}                                         \rightarrowm_{0}=y_{0} 

m_{i+1}=m_{i}+1(d>1)                 \rightarrowm_{i+1}=m_{i}+1(e>0.5)             

y_{i+1}=\left\{\begin{matrix} m_{i}+1 &(d>0.5) \\ m_{i}& (d\leqslant 0.5) \end{matrix}\right.              y_{i+1}=\left\{\begin{matrix} m_{i}+1 &(e>0) \\ m_{i}& (e\leqslant 0) \end{matrix}\right.

此次换元将d同0.5浮点数的判断转变成了e与0的判断。但是出现了新的问题e_{0}的初值为浮点数、e要同0.5比较来决定是否-1,以及一开始遗留的k可能为浮点数的问题

2.令t=2e\Delta x(△x>0)

 e_{0}=-0.5                                    \rightarrowt_{0}=-\Delta x

 e_{i+1}=e_{i}+k                               \rightarrowt_{i+1}=t_{i}+2\Delta y

 e=e-1(e>0.5)                      \rightarrowt=t-2\Delta x(t>\Delta x)

 m_{0}=y_{0}                                        \rightarrowm_{0}=y_{0} 

 m_{i+1}=m_{i}+1(e>0.5)             \rightarrowm_{i+1}=m_{i}+1(t>\Delta x)      

 y_{i+1}=\left\{\begin{matrix} m_{i}+1 &(e>0) \\ m_{i}& (e\leqslant 0) \end{matrix}\right.               y_{i+1}=\left\{\begin{matrix} m_{i}+1 &(t>0) \\ m_{i}& (t\leqslant 0) \end{matrix}\right.

 该换元的思想主要有两方面,一是乘2操作以消除0.5,二是将斜率k分解为△x和△y以便调整参数取整。此时Bresenham算法中已做到只对整数进行运算,完全消去了浮点数。

二.例题推导

A(0,0)、B(10,8)、斜率k=0.8,取△x=5、△y=4

t-531-1-3531-1-35
m00123345677
y01223456678

三.直线算法总结

DDA:先求出斜率k,每进给△x=1,y方向加k,int(y+0.5)向下取整得出目标y值。缺点:k可能为浮点值,0.5为浮点值,涉及到浮点加法。

中点画线法:先求A、B值取整,不断迭代d点,根据d点值确定y值。

Bresenham:将k分解取整,m点为标记点,t决定是否+1确定y值。

这三类算法中,综合比较中点画线法具备整数加法运算同时控制数仅有1个,因此运算效率上最优。从直线画线法得到的启发:数值迭代思想、浮点数分解为整数思想

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

着风少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值