• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MATLABについての質問です。)

MATLABでの多角形障害物回避プログラム作成方法について

このQ&Aのポイント
  • MATLABを使用して多角形障害物を回避するプログラムを作成する方法について質問です。
  • 現在、始点と終点を決めてクリックした場所をつないでいくプログラムを作成していますが、問題文に沿っていません。
  • 最終的にはダイクストラの方法を使用して最短の折れ線経路を求める予定です。

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

A No.1のKulesです。 確かにいろいろ見てみるとこのプログラム動きますね。 まあ直したいところは山ほどありますが、そこは本題ではないのでやめときます。 で、それより問題なのはこのプログラムがきちんと動いているにも関わらず この質問を >MATLABについての質問です。 と思っていることでしょうか。 Matlabはちゃんと動いているのであれば、この質問は >現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるプログラム に対する質問であって、Matlabについての質問ではないですよね。 (アルゴリズムに関する質問とでもいいましょうか) ということで、まず考えるべきは >現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるプログラム をどのような考え方で組むかであって、それをMatlabでどう書くかではありません。 もう一つ「ダイクストラ法」についても同様で、 まず ・ダイクストラ法とは何たるかを勉強する(ここはもうクリアしているんですよね?) ・それをプログラムでどのように書けば実現できるのか調べる となります。で、どのように書けばいいかを調べるには別言語でも構わないので そのアルゴリズムをそのまま書いたサンプルを見つけることです。 例えばgoogleで「ダイクストラ法 プログラム」を検索してみると、 5分と立たず http://www.ss.cs.meiji.ac.jp/CCP024.html のようなサイトを見つけられます。これはcで書かれているようですね。 cのプログラムが読めるのであれば、それをMatlabの文法に従って翻訳してやればいいですね。 ということで、まず「今詰まっているのはMatlabではなく、アルゴリズムそのものだ」という認識を持つ必要があります。 と、ここまで偉そうに書きましたが、もしかしたらアルゴリズムは完成しているのかも知れませんよね。 >現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求める という機能をどうやって実現するか。 などすでに自分の中にあれば(プログラムではなく、文字での説明でも)補足していただければ有用な回答ができると思います。 まあ私の思いつきで書くなら、 例えば始点と終点を決めたらその間を結ぶ直線と一つの多角形が交点を持つか調べ、交点を持っているのであれば 多角形の頂点の一つを選んで始点→頂点→終点と結べば多角形を回避できますね。多角形が複数あるのであれば何回も繰り返せばよいでしょう。 参考になれば幸いです。

syounan101
質問者

お礼

ありがとうございました。 無事ここまでできました。

その他の回答 (1)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

えっと…まずこのプログラムちゃんと動きます? 何か不安になるところがたくさんあるんですが。 で、仮にもプログラム載せるのであればコメントぐらい入れて欲しいなあ…と思ってみたり。 (解読するのも大変なので) 雰囲気としては、figure(1)で任意多角形を定義して、figure(2)でそれを描いた上で通る点を指定し、 figure(3)で多角形と通る点を書いた上で通る点を結んでいくって感じですかね? これを全部違うfigureに描く理由はなんですかね?hold onの使い方は分かっているようですし。 あと、ここに投稿する分には構いませんが各行の最後は;で終わっておいた方がよいですね。余計な出力がうっとうしいので。 まず if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 ってエラー出ませんか?私の感覚だと&じゃなくて&&じゃないとエラーが出る気が…あとそれぞれの比較もallかany使うとか。 (if文にlogicalを与えることは出来ますが、logicalのベクトルや行列は与えられなかった気が) ginputを使ってる文はfinalで1000回とかで区切るよりはwhile使った方がいい気はしますが、本質ではないですね。 とまあいろいろ書きましたが、結局どこで止まっているのかがわからないです。 私が一読した感じだとこのプログラムはまともに動かなさそうですが、 >今は始点と終点を決めてクリックした所をつないでいくプログラムができたのですが問題文に沿ってできていません。 という書き方をしている以上動いているのでしょうし。 ダイクストラの方法というのがどのようなものかはわかりませんが、Matlabの組み込み関数になければ自作するしかないですし、自作するならその手の本を読んでそれに書かれている通り組めばとりあえず動くものは出来そうですしね。 というわけで、現在どの状態でしょうか? 1.「今は始点と終点を決めてクリックした所をつないでいくプログラムができたのですが問題文に沿ってできていません。」とは書いたが、実は上手く動いていない。どのようにすればエラーなく動くようになるのか? 2.一応動いてはいるが、自分の意図したものとは違う動き方をしている。なぜ?(これは、どのような意図をして書いたのかがわからないと回答のしようがありません) 3.一応意図通りに動いているが、ダイクストラの方法をどのようにして組めばいいかがわからない。 この辺りも含めて補足していただければ、もう少し有用な回答ができるor他の方から付くかも知れません。 参考になれば幸いです。

syounan101
質問者

補足

2と3です。わかりづらく大変申し訳ございません。 まず2ですがプログラムは動いています。 任意の物体を配置した後クリックして点をうってその点たちを任意の図形と交わらないようにつなぎ回避経路を求めたいのですが今のプログラムだとひと経路づつクリックしてつないでいくようなプログラムになっていて全部の回避経路を求める場合なかなか難しくなってきます。 是非その辺を改善したく質問させて頂きました。 3ですがダイクストラ方法をどのように組めばいいかネットなどで調べたのですがアルゴリズムは理解したのですが具体的な組み方が分からずプログラムを書くことができませんでした。 是非お力添えよろしくお願い致します。

関連するQ&A