質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

3回答

2093閲覧

空間分割の方法

mikamikan

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2015/12/09 02:09

編集2015/12/09 04:43

###前提・実現したいこと
キャラクターが動く迷路ゲームのようなものを作成しています。
また、現在AIにも興味があるので最終的には自動で動くものを作成したいと考えています。
###発生している問題・エラーメッセージ
360度どの方向にも動ける仕様で作成したいと思っています。
フィールドはこのような感じで、左下から出発し設定したゴールへ向かわせます。
イメージ説明

上にも書いたのですが、自分でキャラクターを動かすのではなく、AIにキャラクターを動かしてもらうことが目的です。
そのためには、自分が今いる現在地などを整数で表す必要があると本で読みました。
今360度どこにもいけるプログラムを書きたいので下の図のよう360度を45度ずつ分けてエリアを分割したいと思っています。
イメージ説明

----------------------------------------追加-------------------------------------------

このエリアの分割でキャラクターの状態を表現しようと思うと、(30.5,40.5)の時と(5.5,10.5)の時の区別がつけられないのではないかと考えました。
イメージ説明

そのため、キャラクターの(x,y)座標とエリアの中心からの角度でキャラクターの状態付けをできないかどうかというのが悩みです。

衝突判定や空間分割などのサイトやと本で調べた結果、"四分木空間分割"が近いかと思ったのですが、私の作成したい度数で分けることには流用できないような気がしています。
わかりづらい質問で申し訳ありませんが、もし、このように度数でエリアを分割する方法をご存知の方がいらっしゃいましたら教えてくださるとうれしいです!

よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
C言語で作成中です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

質問内容を読んでも、Chironianさんへのコメントを読んでも、角度でエリア分けしないといけない理由がいまいちよく判りません。そもそも、エリア分けは必要でしょうか?

シンプルな衝突判定であれば、自機の座標と敵機の座標さえ判ればピタゴラスの定理で計算できます(一定の距離に近づいたら衝突したとみなす)。方向を知りたければ逆三角関数(atan2)で算出できます。
あるいは、自機の方向と移動距離が判れば三角関数で座標が算出できます。
迷路の壁との衝突判定であれば、自機の移動方向の線分と壁の線分との交点を算出すればできそうです。固定物の場合はマスクイメージを使えば簡単にできるかもしれません。

まずは、エリア分けなど考えずに作ってみてはどうでしょうか。その上で、もし処理速度に不満があるなら、自機を中心とした円形あるいは正方形の範囲で絞り込むとか、四分木空間分割などのアルゴリズムを試すなどすれば良いかと思います。

投稿2015/12/09 06:15

catsforepaw

総合スコア5944

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。mikamikanさん自身が混乱されているような印象を受けます。

そのためには、自分が今いる現在地などを整数で表す必要があると本で読みました。

その通りですね。XY座標を使って表現することが多いと思います。

今360度どこにもいけるプログラムを書きたいので

こちらは移動方向を角度で表現したいということですね。
もし、一度に移動する量が「1コマ」であれば、移動は「上下左右と斜め4方向」の計8通りだけですね。

下の図のよう360度を45度ずつ分けてエリアを分割したいと思っています。

ここが分かりません。「エリア」ってなんでしょうか?
角度の範囲を「エリア」と表現することはあまりないと思いますので、この辺に混乱が感じられます。

現在位置が(x, y)で、x軸正の方向から反時計回りに角度θで、距離r移動したい場合、移動後の位置(x', y')は

x'=x + r・cosθ
y'=y + r・sinθ

となりますね。
この辺がヒントにならないでしょうか?

投稿2015/12/09 02:56

編集2015/12/09 02:58
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikamikan

2015/12/09 04:35

回答ありがとうございます。 ご指摘の通り、混乱中です。 説明不足で大変申し訳ありませんでした。 私は一番上の図のようなキャラクターを動かすためのフィールドを用意しました。これは0<x<250,0<y<250の範囲で設定しました。 次に障害物を設定するため、このフィールドを0から24の25個のエリアに分割しました。 初めは4方向に1マス(1エリア)ずつ動かしていたので、このエリア0から24を用いてキャラクターの現在位置を管理していました。 今、作成したいと思っているのはキャラクターの座標が (x , y) の時、 指定したangle 度の方向へ 5.5ずつ進みたい場合です。 動いた後の座標は以下の式で計算しています。 x+=cos(angle*3.1415926535/180)5.5; y-=sin(angle*3.1415926535/180)*5.5; この場合だと、上で設定したエリアの大きさよりも動く距離が小さいので同じエリアの中を何回も動くことになると思います。 AIに問題を解かせることを現在考えているのですが、そのとき、上のやり方と同じでエリアの番号だけでキャラクターの状態を管理していると例えば(5.5,10.5)と(30.5,40.5)の二つの座標がAIには区別できないのではないかと考えました。 ![イメージ説明](dc7d6ceb990921e2caa54eea0f972866.png) そのため、キャラクターの(x,y)座標とエリアの中心からみてキャラクターがどの角度にいるのかの2つを用いて状態付けする良い方法があるかどうかというのが悩みです。 長くわかり辛い文になってしまいました、申し訳ありません><
mikamikan

2015/12/09 04:37

すみません、画像が添付できなかったので質問の本文を更新します。
Chironian

2015/12/09 05:25

> キャラクターの(x,y)座標とエリアの中心からの角度でキャラクターの状態付けをできないかどうかというのが悩みです。 これだけでしたら、エリアを45度単位で区切った8つのサブエリアに分割して、0~ 7の番号を振り、エリア番号0~24とサブエリア番号0~7でキャラクタの状態管理はできると思います。 しかし、この管理方式はキャラクタの位置関係を表現できないので、平面上の問題を解く際にはあまり良い表現方法ではない可能性が高いです。実際にAIを使ってどんな問題を解こうとされているのか、書かれた方が良いように感じます。 もし、エリアの境界に壁を立てて「迷路」を作り、スタートからゴールへ至る道をAIに探させることを想定されているのでしたら、根本的な部分を勘違いされているかも知れません。 0.0~250.0で表現しているキャラクタの座標(x, y)を整数で表現した方が問題は解きやすい筈です。例えば、(5.5, 10.5)を丸めて(6, 11)、もしくは、10倍して(55, 105)で表現するなどです。
guest

0

質問文、こういう解釈でよろしいでしょうかね。

  • 正方形のセルで8方向に隣接関係があるマップ上でものを動かしたい。
  • 移動は、隣接しているセルにだけ行うようにしたい。
  • ただし、斜め方向の移動はピタゴラスの定理に準じた距離だけ移動するのを実現したい
  • これを実現するためにセル内を「どちら方向へ移動中」という意味の8つのサブセルに分けることで表現しようとしているが行き詰まっている

隣接しているセルにしか、というのは質問文内にはありませんでしたが、おそらく前提条件ですよね? 迷路ゲームということは、壁がどのくらいの厚さを持つオブジェクトになるのかわかりませんが、飛び越えてしてしまうのは避けないといけないということでしょう。だから「縦横方向には1ステップで3セル、斜め方向なら1ステップで2セル飛べる」なんていうのは解決にならないと。

まずこの理解は合っていますでしょうか。

投稿2015/12/21 03:59

yuba

総合スコア5570

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問