上次我们说明了Bresenham直线算法的原理和实现过程,但是上次我们只是给出了一个方向上的直线画法,这次我们就来说明一下如何画出所有方向上的直线。 其实想要画出全方向上的直线是很简单的,只要分别单独求出8组不同方向上的算法,写成8个函数,然后需要画直线的时候就调用相应的函数。很显然,这是最简单的,但这不是今天的主题,今天我想说明的是,如何把这8个函数整合到一起,只用一个函数就能画出所有方向上的直线。 想要综合所有的8个方向,需要解决两个问题:
- 如何将 归一到一种计算式子中去
- 如何将8种不同的循环归一到一个循环中去(最后发现只能归一到两个循环中)
一、d0 d1 d2的归一
首先,我根据已经得出的八个方向上的d0、d1、d2的求法,得出下表:
斜率K
|
DeltaX
|
DeltaY
|
d0,d1,d2
|
|K|<=1
|
>0
|
>0
|
d0=b+2a;d1=2a;d2=2(a+b);
|
<0
|
>0
|
d0=b-2a;d1=2(b-a);d2=-2a;
|
|
<0
|
<0
|
d0=-b-2a;d1=-2a;d2=-2(a+b);
|
|
>0
|
<0
|
d0=-b+2a;d1=2(a-b);d2=2a;
|
|
|K|>1
|
>0
|
>0
|
d0=b+2a;d1=2a;d2=2b;
|
<0
|
>0
|
d0=b+2a;d1=2a;d2=2(b-a);
|
|
<0
|
<0
|
d0=b+2a;d1=2a;d2=-2b;
|
|
>0
|
<0
|
d0=b+2a;d1=2a;d2=2(a-b);
|
现在的任务是根据 |K| 、DeltaX、DeltaX这三个变量,将d0,d1,d2的计算方法统一到一个式子中去。 观察表格,确定基本思路:将 |K| 、DeltaX、DeltaX三个量数值化,构造出新的计算式,在新的计算式中加入 |K| 、DeltaX、DeltaX三个变量,使其满足以上8种情况。由于一下子由8至1比较困难,先从8个式子归一到2个式子,再由2个式子归一到1个式子:
由八归二
首先,需要对 |K| 、DeltaX、DeltaX数值化,定义 Pk Px Py 为:
(至于为什么要这么定义,我也说不清,只是觉得这样定义可以简化后面的计算,仅此而已,也许存在其他的定义方式,可以使得计算更加简单)