Nickの答えを少し具体化する:DDAアルゴリズム(3次元でも同様に機能する)の背後にあるコアコンセプトは、グリッドの各軸について、その軸の次の「交差点」を追跡するということです。行パラメーター。アルゴリズムの各ステップは、次の交差点(2次元での単純な比較)を持つ軸を見つけ、適切なステップを実行し、各軸の次の交差値を更新することで構成されます。
ここの行は '(x、y)=(x0、y0)+ t *(m、n)'と書くことができます。ここで、m = x1-x0およびn = y1-y0です。グリッドセルの次元がgxとgyの場合、dx — 1つのグリッドセルと交差するのにかかる距離(tパラメーターの観点から)—少しの代数で見つけることができます。方程式のペアxから= x0 + m t、(x + gx)= x0 + m(t + dx)gx = m * dx、つまりdx = gx / mになります。同様に、dy = gy / n。アルゴリズムは、next_x(ラインに沿って次の赤い点までの距離)とnext_y(ラインに沿って次の青い点までの距離)を追跡し、別の交差点にぶつかるたびに更新するため、中央ループは次のようになります:
while ( cur_t < t_max) {
if ( next_x < next_y ) {
cell_x++;
cur_t += next_x;
next_y -= next_x;
next_x = dx;
} else {
cell_y++;
cur_t += next_y;
next_x -= next_y;
next_y = dy;
}
// Process the cell (cell_x, cell_y)
}
このコードには多くの詳細がないことに注意してください。たとえば、next_xやnext_yを初期化する方法はわかりません。垂直線や水平線などの特殊なケースを扱いやすくするために、ほとんどの分割を排除する方法があります。cell_xとcell_yをインクリメントするかデクリメントするかは、ラインがどの象限にあるかによって異なります。この例のラインでは、m(x1-x0)が負であるため、ティックごとに実際にcell_xを減少させることに注意してください。また、ラインがエッジで遷移するのではなく、セル間のコーナーを正確に通過するケースをどのように処理するかを決定する必要もあります。うまくいかない可能性のある小さな詳細がたくさんあり、それは多くのテストを必要とします。それでも、うまくいけば、これにより、アルゴリズムのコアアイデアが何であるかがわかるようになります。