atan2関数の利用

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
匿名

atan2関数の利用

#1

投稿記事 by 匿名 » 16年前

角度を求めるatan2関数ですが、ホーミングの所などのサンプルプログラムで、求めた角度を使ってX,Yの値をどう変化させているのかがわかりません。そもそもX,Yの値を変化させる処理がどこなのかも分かりません。そのあたりを分かりやすく教えてください。

たいちう

Re:atan2関数の利用

#2

投稿記事 by たいちう » 16年前

void calc_cshot()という関数の中でやってますね。
//ショットの移動計算
void calc_cshot(){
	...
	if(cshot.knd==1)
		calc_homing(i);
	cshot.x+=cos(cshot.angle)*cshot.spd;
	cshot.y+=sin(cshot.angle)*cshot.spd;
	...
}

管理人

Re:atan2関数の利用

#3

投稿記事 by 管理人 » 16年前

atan2の利用方法について聞いているような題名ですが、
そうではなく、角度からx,y成分を計算する方法が知りたいという事でしょうか?

匿名

Re:atan2関数の利用

#4

投稿記事 by 匿名 » 16年前

知りたいのは両方ですが、atan2の引数と戻り値、あと戻り値をXY座標に反映させているのはどの部分かです。

通りすがり

Re:atan2関数の利用

#5

投稿記事 by 通りすがり » 16年前

回答してくれた内容読んでないんでしょうか?

たいちう

Re:atan2関数の利用

#6

投稿記事 by たいちう » 16年前

> atan2の引数と戻り値、
void calc_homing(int k)
{
	...
	cshot[k].angle=atan2(y,x);
	...
}
> あと戻り値をXY座標に反映させているのはどの部分かです。
void calc_cshot(){
	...
	cshot.x+=cos(cshot.angle)*cshot.spd;
	cshot.y+=sin(cshot.angle)*cshot.spd;
	...
}

匿名

Re:atan2関数の利用

#7

投稿記事 by 匿名 » 16年前

すいません読解力がなくて・・・
cshot[k].angle=atan2(y,x);
これのx,yは何の座標でしょうか?
あとcshot[k].angleに戻り値が入るのはわかりますが
atan2の戻り値は何ですか?x,yに対するcosですか?

御津凪

Re:atan2関数の利用

#8

投稿記事 by 御津凪 » 16年前

atan2 の戻り値は 角度(ラジアン)です。
この角度は対象先への角度となります。

atan2 に渡されている x,y は、対象元の座標 - 対象となる座標です。(逆かも?)

たいちう

Re:atan2関数の利用

#9

投稿記事 by たいちう » 16年前

> atan2の戻り値は何ですか?x,yに対するcosですか?

三角関数を理解しましょう。

y = f(x)というスタイルで書きます。
y = tan(x)という関数があります。

tan(x)の逆関数がatan(x)。
y = tan(x)ならば、x = atan(y)となります。
戻り値は角度(単位はラジアン)

y = tan(x)が、角度から傾きを求める関数なので、
y = atan(x)は、傾きから角度を求めるための関数です。

y = tan(x)のグラフを思い浮かべてもらえば(or 探してもらえば)分かりますが、
このグラフは連続でなく、その逆関数であるy = atan(x)も連続ではないので、
傾きから角度を求めるには場合分けが必要です。


# ここまでの説明のxとyは、関数の引数と値を表していました。
# 以降のxとyは、二次元座標系でのx座標とy座標、x成分とy成分、等を表します。


場合分けをしないですむ便利な関数がz = atan2(y, x)です。
傾きが(yの増加分) / (xの増加分)であることから、(yの増加分)と(xの増加分)を
引数として渡せば、その角度を返してくれる関数です。

匿名

Re:atan2関数の利用

#10

投稿記事 by 匿名 » 16年前

よくわかりました
ところで
cshot.x+=cos(cshot.angle)*cshot.spd;
cshot.y+=sin(cshot.angle)*cshot.spd;
の部分ですが
これってどこが関数なのか変数名かよくわかりにくいですね
一体どんな処理が行われているのでしょうか?
cshot.x+=は
X座標=X座標+
cshot.angleは角度ですよね
では
cos()*とcshot.spd;の部分はどういう意味でしょうか?

たいちう

Re:atan2関数の利用

#11

投稿記事 by たいちう » 16年前

中心が原点、半径rの円の座標は次の式で表せます。
x = r * cos(θ)
y = r * sin(θ)
(0 <= θ <= 2 * π)

上式のrに該当する部分が、cshot.spd。
θがcshot.angleです。

上式は静止した座標を扱っています。
速度の概念を次の式であらわせられます。

新しい座標 = 元の座標 + 微小時間 * 速度

HPの説明を読んでいませんが、きっと微小時間(単位時間?) * 速度が
spdに代入されていると考えてよいでしょう。
これらの式を組み合わせると、件の式になるわけです。

管理人

Re:atan2関数の利用

#12

投稿記事 by 管理人 » 16年前

>これってどこが関数なのか変数名かよくわかりにくいですね

関数はcos,sinで引数は括弧で始まって括弧で終わっている部分までです。
みにくかったらスペースを空けるなどしてみるといいかもしれません。
コサインやサインにスピードをかけたものを足しているだけです。

単位円ってご存知でしょうか?
黒い矢印の長さはいつも1ですよね。
sinもcosもx,yの値は-1~1の値を移動し、矢印の長さは1です。
これを移動量として使用するなら、現在弾のスピードが1なのですから、
たまに設定したスピードである.spdをかければそのスピードになります。

移動計算はx,yにわけて行う必要があります。
角度に対してx成分が求まるのはcosですよね。
斜辺を底辺でわったものですから。
今45度に弾がむいているとすると、大きさ1に対してxの移動量は0.7位のはずですよね。
スピードが3ならこの0.7に3をかければxの移動量も3倍になります。
yも同様に計算します。
高校1年位の教科書に載っていると思うので、もし匿名さんがこの年齢以上でしたら
一度おさらいしてみてはどうでしょうか。
(昔とかわっていたら、高1じゃないかもしれません)

匿名

Re:atan2関数の利用

#13

投稿記事 by 匿名 » 16年前

そうですね一度教科書を見直します

閉鎖

“C言語何でも質問掲示板” へ戻る