2012-02-22 6 views
2

私は理論的なセルを含むグリッドクラスを設定しました。与えられた角度に沿ってグリッドセルのセットを素早く選択するにはどうしたらいいですか?

Iは、引数として開始点、ラジアンとの距離を受け入れる方法collectCells()を有します。このメソッドは、指定された角度に沿っており、始点から指定された距離内にあるすべてのセルを含むArrayを返すようにします。

enter image description here

私はこれを行うための最も簡単な方法は、与えられた方向のすべての画素を単にループであり、私が行くように、細胞を拾う、のようなもの:これは本当に明らかである

for(var i:int = 0; i<distance; i++) 
{ 
    startPoint.x += Math.cos(radians); 
    startPoint.y += Math.sin(radians); 

    if(start point falls within uncollected cell) collect cell; 
} 

貧しい、ループは私が指定する距離ほど長くなるので - 極端に遅い。

私が最後に収集セルとラジアンを受け入れるnextCell()メソッドを作成、別の何かを試してみました。この方法では、ラジアンで指定された方向に25ピクセルのポイントを投げ、得られたセルを収集してから、所定量のセルに対してそのセルから開始しました。

私は本当にはっきりと十分にこのアプローチを考えていなかった、とかつて私は、私は実際のパステストが次のセルが求められるたびに、例えば壊れますということで、問題があったことに気づい終わっ緑色の点線は所望の経路であり、青線はチェックは、各セルの中心から作られているので、各nextCell()コールを構成する経路である

enter image description here

指定された距離(ピクセル)にわたって特定の方向に効率的にセルを収集する正しい方法はありますか?

+2

各反復で 'sin'と' cos'を計算しないと、あなたのメソッドは遅くなることはありません。とにかく、あなたが探しているのは[4接続ライン](http://stackoverflow.com/q/5186939/111461)です。 –

+0

@SamHocevar良い点、私はループの外側に移動します。 – Marty

答えて

2

Bresenham's line drawing algorithmを使用することもできます。文字通りピクセル幅の線を描画しようとしていますが、巨大なピクセルを描画しようとしているためです。

+0

デフォルトでは、Bresenhamは8接続線を描画しますが、Askerは4接続線を描画します。 –

関連する問題