私は私の古いプロジェクトを捨てています。それがしなければならなかったことの1つは-デカルトグリッドシステムとグリッド上の2つの正方形が与えられた場合、それらの2つの正方形の中心を結ぶ線が通過するすべての正方形のリストを見つけます。
ここでの特殊なケースは、すべての開始点と終了点が正方形/セルの正確な中心に限定されることです。
ここにいくつかの例があります-サンプルの開始点と終了点のペアを使用します。影付きの四角は、それぞれの関数呼び出しによって返される必要がある四角です。
死んだImageShackリンクを削除しました-例
始点と終点は、それらが入っている正方形で参照されます。上の図では、左下がであると仮定すると、[1,1]
右下の線はとして識別さ[6,2]
れ[9,5]
ます。
つまり、左から6列目の(中央の)正方形から2行目の下から9列目の(中央の)正方形まで、下から5行目です。
これは実際にはそれほど複雑ではないようです。しかし、どういうわけか、オンラインで複雑なアルゴリズムを見つけて実装したようです。
とても、とても速かったことを覚えています。同様に、フレームごとに数百回または数千回の速度で最適化されます。
基本的に、線(線がグリッド線と交差する点)に沿って、正方形の境界から境界へとジャンプしました。次の交差点がどこにあるかを知るには、水平方向と垂直方向のどちらの交差点が近いかを確認し、次の交差点に移動しました。
これは概念的には大丈夫ですが、実際の実装はそれほどきれいではないことが判明し、最適化のレベルが実際に必要なものに対して高すぎる可能性があることを恐れています(私はこのトラバーサルと呼んでいます)アルゴリズムはおそらく1分間に5〜6回)。
シンプルでわかりやすく、透明な直線グリッド走査アルゴリズムはありますか?
プログラム用語で:
def traverse(start_point,end_point)
# returns a list of all squares that this line would pass through
end
ここで、指定された座標は正方形自体を識別します。
いくつかの例:
traverse([0,0],[0,4])
# => [0,0], [0,1], [0,2], [0,3], [0,4]
traverse([0,0],[3,2])
# => [0,0], [0,1], [1,1], [2,1], [2,2], [3,2]
traverse([0,0],[3,3])
# => [0,0], [1,1], [2,2], [3,3]
コーナーを直接移動する線には、線の「翼」に正方形を含めないでください。
(古き良きブレゼンハムはここで機能するかもしれませんが、私が望むものから少し逆になっています。私が知る限り、それを使用するには、基本的にそれを線に適用してから、上のすべての正方形をスキャンする必要があります真または偽のグリッド。大きなグリッドの場合は実行不可能(または少なくともエレガントではない))
(私の誤解のため、ブレゼンハムとブレゼンハムベースのアルゴリズムを再検討しています)
明確にするために、これの1つの可能なアプリケーションは、ゾーン(グリッド)内のゲームにすべてのオブジェクトを格納していて、光線があり、光線がどのオブジェクトに接触するかを確認したい場合です。このアルゴリズムを使用すると、マップ上のすべてのオブジェクトではなく、指定されたゾーン内にあるオブジェクトのみに対して光線をテストできます。
私のアプリケーションでこれを実際に使用すると、すべてのタイルに効果が関連付けられ、オブジェクトは毎ターン特定の線分を移動します。毎ターン、オブジェクトが通過したマス目、つまりオブジェクトに適用する効果を確認する必要があります。
この時点で、私が持っている現在の実装は機能することに注意してください。この質問は主に好奇心を目的としています。このような単純な問題には、もっと簡単な方法が必要です...どういうわけか...。
私は正確に何を探していますか?概念的に/きちんとしていてきれいなもの。また、正確に指定しているため、すべての開始点と終了点は常に正方形/セルの中心にあることに気付きました。だから、おそらくそれを利用する何かもきちんとしているでしょう。