Bresenham 的算法用于在正方形网格上绘制一条线,例如像素。
该算法部分基于将平面细分为称为八分圆的 8 个部分。
诀窍是使用对称性来概括算法,而不管第二个点位于何处:首先我们将其“移动”到第一个八分圆,然后进行计算,最后将生成的点转换回其原始八分圆。
Wikipedia 提供了执行该技巧的基本功能。
function switchToOctantZeroFrom(octant, x, y)
switch(octant)
case 1: return (x, y)
case 2: return (y, x)
case 3: return (y, -x)
case 4: return (-x, y)
case 5: return (-x, -y)
case 6: return (-y, -x)
case 7: return (-y, x)
case 8: return (x, -y)
此外,它写道,我们只需要:
翻转输入和输出的坐标系
这是基于这些换位实际上是对合的事实:f(f(x)) = x
没有太注意它,我首先认为它会起作用。
但是对于案例 3 和 7,它不起作用,因为它不是对合。
例如:
Case 4: (-5, 1) => (5, 1) => (-5, 1) // Good
Case 3: (-1, 5) => (5, 1) => (1, -5) // Not good
我们必须再次做到这一点:
Case 3: (-1, 5) => (5, 1) => (1, -5) => (-5, -1) => (-1, 5) // Good
那么,我是不是误会了什么?
或者实际上是在起草维基百科文章时缺乏精确性,是否应该有人改进它?
如果没有我需要使用两个函数switchToOctant_onInput
和switchToOctant_onOutput
(我现在看到的这个问题的明显解决方案),就没有更好的方法来进行这些转换吗?