フリーグリッドのルート探査について助言が欲しいです。
既にライブラリやアルゴリズムについて書かれている物がある場合は教えて欲しいです。
初期位置と最終到達座標が与えられます。
半径(r)のある物体が移動します。(1)
位置は実数(浮動小数)で表されます。
マップ上には厚みのない壁があり、整数座標の位置にP(座標)とV(ベクトル)で表されます。(2)(3)
壁の端は半径rの分だけ離れて通過します。(4)(5)
計算量や計算の難易度により、多少めり込んでも構いません。(4')
最悪壁から離れなくても構いません。(4'')
手作業でおおよその目標ルートを(4)(4')と(5)で書いてみました。
最終的にこの赤点を辿る順番で得られたらいいと思っています。
マップのサイズは可変でここでは単純に小さく示していますが、とても広いマップを想定しています。
・単純な上下左右移動による検索
アルゴリズムとして確立した物があるので、この検索自体は出来るのですが問題があります。
上側を通るルートは(0,0)(1,0)(1,1)(2,1)(2,0)...
となりますが、最終的に得られたステップ数と移動ルートの長さが(3)の壁を回り込む様な場合に正しく得られない事です。
最短を得たい場合に全てのルートを取得した上で、赤点を算出して全てのルートの長さを得なければなりません。
また、(2)壁の下の2x2の様な同じコストのルートがある場合など、赤点を正しく作る方法が思いつきません。
この方法は、到達できるかの判定用には使えるのですが、もう少しエレガントな方法でルートを見つけられないかなと思っています。
・壁とベクトルの衝突判定
始めにスタート地点から目標地点までの直通ベクトルに対して全ての壁との衝突判定をして、ヒットしていたら分割して行くという方法も考えたのですが、
(4,3)(7,4)(8,5)の壁がまずヒットし...と仮の中間点を追加して行きつつそれらを結ぼうと思っても、(7,4)の壁から座標(7,3)辺りに中間点を置くとした場合に、上のルートにならない状況が考えられてしまったりしてどうしたものかと思っています。
(2018/06/07)追記
重要なのは壁の端というのは分かっていたのですが、「どの壁の端か」を特定する為に、ベクトルの衝突(交差)という方法を用いようとしました。
追加した中継点が必要か不必要かの判定も必要で、「端点か角」の中継点が有用であるのも直感的に理解は出来ます。
「上下移動による検索」のルート探査を行った上で、中継点がどの領域と接しているかによってどっちのルートの中継点になるかを判別可能である、というのは上の文章を書いてから気がつきました。(下図)
灰色はルート1とルート2の共有ルートです。
色(ルート)に属していない中継点は検索の対象から外せます。
ルートであるのに色の付いていない所は、同じコストの別ルートがある場合。(だけど、条件としてはこれでは駄目で、route2と書かれた右上の白い場所が壁で囲まれていた場合、この条件では破綻します)
色の上であるのに端点としては使えないものがあるが、条件が分からない。(灰色に青い点が付いた中継点)
ベクトルの衝突判定は、端点を出す為ではなく、中継点を接続した時に有効かどうかを判定する為に使えそう。
まだ整理が付いていないですが、まだまだ自分の理解が浅いというのを痛感しています。
時間もなく、考える頭の許容量も目一杯で、分不相応な課題に取り組んでいる事も痛感しています。
議論の場として機能してほしいのですが、ベストアンサーを付けて終了しなければならないのかとも思っていて不安です。もう少し考える時間がほしいと思っています。私のわがままなのですがすいません。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/07 11:50