2012-04-27 13 views
2

ラインセグメントと交差するタイルはすべて見つけなければならないが、Bresenhamのラインアルゴリズムは自分の要求に合わない。私はすべての細胞を見つける必要があります。私は交差点を知る必要はない、交差点の事実だけ。手伝ってくれてありがとう。ラインセグメントと交差するすべてのタイルを見つける

私は、線の方向ベクトルを見つけ出し、段階的にセルをタイルサイズで除算することによって見つけると考えました。しかし、正しいステップサイズを選択する方法はわかりません。 1 pxのステップが悪いと思います。 2D及び3Dの場合、Amanatides及びWoo "レイトレーシングのための高速ボクセルトラバーサルアルゴリズム"の

+0

私の要件に適合しないとはどういう意味ですか?どのようにしてフィットしませんか? –

+0

デルタパラメータにすべてのセルだけが見つかりません。ウィキペディアのサンプル画像を見てください。 –

答えて

1

あなたはで見られる多くのライン方程式のいずれかを使用する場合があります座標系の単位でxを任意の方向に動かしながら交差する場合は、タイルの最小xから最大のxまでの任意の方向を選択します。座標系が画面の場合、1ピクセルで十分です。

これはあなたが直面している問題の正確な性質について詳しく知ることなく、私が知ることができるヒントです。

+0

"あなたのタイルにマッチする"という意味は?私は正確にこの操作のためのアルゴリズムが必要です。 –

+0

タイルはどのような幾何学的形状ですか? – fritzone

+0

私は正方形のグリッドを持っています –

0

Bresenhamのアルゴリズムを変更して、必要なものを追跡するのは簡単です。アルゴリズムの関連する部分は次のとおりです。

plot(x,y); 
error = error + deltaerr; 
if (error >= 0.5) 
{ 
    y = y + ystep; 
    error = error - 1.0; 
} 

すべてのセルを追跡するには、別の変数が必要です。私はこれを厳密にチェックしていないことに注意してください。

plot(x,y); 
olderror = error. 
error = error + deltaerr; 
if (error >= 0.5) 
{ 
    y = y + ystep; 
    error = error - 1.0; 
    extra = error+olderror; 

    if (extra > 0) 
    { 
     plot (x,y); /* not plot (x-1,y); */ 
    } 
    else if (extra < 0) 
    { 
     plot (x+1,y-1); /* not plot (x+1,y); */ 
    } 
    esle 
    { 
     // the line goes right through the cell corner 
     // either do nothing, or do both plot (x-1,y) and plot (x+1,y) 
     // depending on your definition of intersection   
    } 
} 
+0

後で試してみます結果について報告します –

+0

'plot(x-1、y)'と 'plot(x + 1、y)'にエラーがあります。座標は間違っています。それは 'plot(x、y)'と 'plot(x + 1、y-1)'でなければなりません。私はコードを更新しました。 –

+0

また、急峻な線を扱うと 'plot(x、y)'は 'if(steep)plot(y、x)になります。 else plot(x、y); '、および他の' plot'呼び出しは同様に変更されます(wikipedia記事の2番目のリストのように)。 ' –

関連する問題