- ベストアンサー
たゆんだ糸をピンと張るような数式
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まだ締め切っていないようなので、考えたことを回答します。 簡単にするために、下側の壁だけで考えます。 壁の座標を、W(i)=(x(i),z(i))[t=0→n]、(nは十分大きい値とします) 点(x,z)が壁の内側か外側かを判定する関数を、F(x,y) ルートの座標をR(i)=(X(i),Z(i))[i=0→n]で表し、 ルートの初期値をR(0)=W(0)、R(n)=W(n)とし、 W(0)→W(n)とします。(→は直線を表します) つまり、ルートの初期値は、始点と終点を結んだ直線です。 (a) 始めに、F(X(1),Z(1))を判定し、壁の外側ならなにもせず、 壁の内側なら、ルートを変更して、R(1)=W(1)とし、 W(0)→W(1)→W(n) (b) つぎに、F(X(2),Z(2))を判定し、壁の外側ならなにもせず、 壁の内側なら、ルートを変更して、R(2)=W(2)とし、 W(0)→W(1)→W(2)→W(n) (ただし、(a)の判定で壁の外側だった場合は、W(0)→W(2)→W(n)) (c) つぎに、F(X(3),Z(3))を判定し、壁の外側ならなにもせず、 壁の内側なら、ルートを変更して、R(3)=W(3)とし、 W(0)→W(1)→W(2)→W(3)→W(n) (ただし、(a),(b)の判定によっては、W(0)→W(3)→W(n) または W(0)→W(2)→W(3)→W(n) または W(0)→W(1)→W(3)→W(n)) このようにしていけば、ルートは壁に沿ったものになるはずです。 と思ったのですが、壁がえぐれている場合は、そうはならないことに気付きました。 それに対応するために、ルートを変更したときに下記の処理をします。 変更した点とその2つ前のノード(直線の結合点)とを直線で結んだときに、その直線が壁の外側になるかを調べます。 直線が壁の内側になる場合は、処理を終了します。 直線が壁の外側になる場合は、1つ前のノードを消去し、さらにその2つ前のノードについても同様に調べ、これを繰り返します。 以上のことをすれば、最短ルートが決定できるはずです。 壁が上にもある場合はもう少し工夫が必要ですが、同じ考え方でなんとかなるかなと思います。
その他の回答 (1)
- sono0315
- ベストアンサー率48% (85/177)
壁の座標がわかるならば、それぞれの突起部分間での接線を うまく求めるといいのではないでしょうか
お礼
回答ありがとうございます。 そういう発想も考えているのですが、 実際に「うまく求める方法」が分からずに困っております。
お礼
大変詳しい説明ありがとうございます。 自分も未だ、いろんなアルゴリズムを考え中です。 せひ参考にさせていただきます。