我有一条从 (x0, y0) 到 (x1, y1) 的线穿过由 2^n 宽的方形瓷砖组成的网格。我不仅需要找到线相交的瓷砖,还需要找到相应的入口和出口点。我可以找到的所有关于此的 SO 问题都处理“1x1”瓷砖,而不关心瓷砖内交叉点的位置。
这些点并不总是精确地在一个整数上,在某些情况下我会使用自然地板,而另一些我会想要四舍五入。但是现在让它在所有情况下都自然下降是可以的。
我找到了一个示例,该示例最终得到了一个非常简单的整数光线跟踪案例,但它不跟踪交点,也不适用于穿过中心的线(假设为 0.5、0.5 偏移) 1x1 瓷砖。
void raytrace(int x0, int y0, int x1, int y1)
{
int dx = abs(x1 - x0);
int dy = abs(y1 - y0);
int x = x0;
int y = y0;
int n = 1 + dx + dy;
int x_inc = (x1 > x0) ? 1 : -1;
int y_inc = (y1 > y0) ? 1 : -1;
int error = dx - dy;
dx *= 2;
dy *= 2;
for (; n > 0; --n)
{
visit(x, y);
if (error > 0)
{
x += x_inc;
error -= dy;
}
else
{
y += y_inc;
error += dx;
}
}
}
它如何适应找到相交的 2^nx 2^n 网格图块,同时还抓住 2 个相关的交点?似乎在一个 tile 中“任何地方”开始的能力真的搞砸了这个算法,我的解决方案最终使用除法,并且可能设置为在每次迭代中累积错误。而且这样不好...
另外我认为对于第一个和最后一个图块,可以假设端点是“其他”交点。