图形学算法--Bresenham算法的改进(综合各个方向)

本文介绍了如何改进Bresenham直线算法,将原本针对8个不同方向的直线画法整合到一个函数中,通过d0、d1、d2的归一化和循环的统一,实现了所有方向直线的高效绘制。文章详细阐述了从8种情况归一到一种计算式子的过程,并给出了最终的归一化循环代码。
摘要由CSDN通过智能技术生成

上次我们说明了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 为:


(至于为什么要这么定义,我也说不清,只是觉得这样定义可以简化后面的计算,仅此而已,也许存在其他的定义方式,可以使得计算更加简单)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值