(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 つの交点を取得するにはどうすればよいでしょうか? タイル内の「どこからでも」開始する機能は、このアルゴリズムを実際に混乱させているようです。私の解決策は、除算を使用し、おそらく反復ごとにエラーを蓄積するように設定することになります。そして、それは良くない...
また、最初と最後のタイルについては、エンドポイントは「他の」交点であると見なすことができると思います。