我正在尝试实现本文所述的算法,该算法用于按直线顺序遍历网格单元,这对于光线跟踪非常有用:
http://www.cse.yorku.ca/~amana/research/grid.pdf
本文将算法描述为两个部分:初始化和迭代遍历。我可以理解迭代遍历部分,但是在理解初始化部分中某些变量的计算方式时遇到了麻烦。
我需要帮助初始化tMaxX,tMaxY,tDeltaX和tDeltaY。它们的初始化过程解释如下:
tMaxX
tMaxY
tDeltaX
tDeltaY
接下来,我们确定射线穿过第一个垂直体素边界的t值,并将其存储在变量tMaxX中。我们在y中执行类似的计算,并将结果存储在tMaxY中。这两个值中的最小值将指示我们可以沿着射线行进多少并仍保留在当前体素中。 最后,我们计算tDeltaX和tDeltaY。TDeltaX表示对于这样的运动的水平分量,等于体素的宽度,我们必须沿着射线移动多远(以t为单位)。类似地,在tDeltaY中存储沿射线的移动量,该射线的垂直分量等于体素的高度。
接下来,我们确定射线穿过第一个垂直体素边界的t值,并将其存储在变量tMaxX中。我们在y中执行类似的计算,并将结果存储在tMaxY中。这两个值中的最小值将指示我们可以沿着射线行进多少并仍保留在当前体素中。
最后,我们计算tDeltaX和tDeltaY。TDeltaX表示对于这样的运动的水平分量,等于体素的宽度,我们必须沿着射线移动多远(以t为单位)。类似地,在tDeltaY中存储沿射线的移动量,该射线的垂直分量等于体素的高度。
我无法从上面给出的英语描述中推断出所需的代码。有人可以帮我将其翻译为数学/伪代码表达式吗?
X坐标变量的初始化(Y相同)
DX = X2 - X1 tDeltaX = GridCellWidth / DX tMaxX = tDeltaX * (1.0 - Frac(X1 / GridCellWidth)) //Frac if fractional part of float, for example, Frac(1.3) = 0.3, Frac(-1.7)=0.3
例:
GridCellWidth, Height = 20 X1 = 5, X2 = 105 Y1 = 5, Y2 = 55 DX = 100, DY = 50 tDeltaX = 0.2, tDeltaY = 0.4 tMaxX = 0.2 * (1.0 - 0.25) = 0.15 //ray will meet first vertical line at this param tMaxY = 0.4 * (1.0 - 0.25) = 0.3 //ray will meet first horizontal line at this param
我们可以看到第一个单元格边界将在参数t = 0.15处满足