我研究的每一篇关于 Bresenham 线算法的文章,他们都在谈论一个决策变量
Pi = dx * (d1 - d2)
这个想法mathematical term
从何而来?
dx * (d1 - d2)
我的意思是,作为决策变量背后的想法是什么?
为什么没有d1 - d2
被采取?
因为我们关心的唯一信息d1-d2
是符号,所以我们可以将它乘以任何正值而不会丢失任何东西。我们实际上并不知道算法的值d1
并d2
立即运行该算法,并且必须根据我们所知道的事物来计算它们的值。但是,此计算涉及除以dX
,并且除法很慢,应尽可能避免。碰巧,dX
它总是正的,所以我们可以将两者相乘d1
以d2
消除dX
除法运算,而不会丢失我们正在寻找的信息。
Bresenham 的算法通过专注于切割成 45 度部分的圆的单个部分来工作,并且只解决其中一个部分。通过考虑可以从点 x1,y1 (即传入的第一个参数)绘制的所有线来形成圆。然而,由于它只关注单个部分(即 x 在两个正方向上比 y 上升得快),为了将解决方案推广到可能形成的所有线,它必须将该圆的所有其他部分转换为一个它知道如何绘制圆圈的方式。通常你会看到一些初始化代码,算法的顶部确保 x1,y1 < x2,y2 并在不成立时交换它们。就必须处理的行数而言,这有效地将圆切成了一半。所以现在下一部分代码只需要处理 4 个不同的斜率。决策变量是一种优化,用于确定算法属于 4 个部分中的哪一个部分。我们总是在 X 的正方向上前进,但问题是我们上/下速度比 X 快(第 1 和第 4 节 - 从顺时针位置开始)还是 X 比 Y 移动更快(第 2 和第 3 节)。
决策变量使我们不必在循环的每次迭代中执行 if 语句。