ページ 1 / 1
atan2関数の利用
Posted: 2008年10月17日(金) 15:46
by 匿名
角度を求めるatan2関数ですが、ホーミングの所などのサンプルプログラムで、求めた角度を使ってX,Yの値をどう変化させているのかがわかりません。そもそもX,Yの値を変化させる処理がどこなのかも分かりません。そのあたりを分かりやすく教えてください。
Re:atan2関数の利用
Posted: 2008年10月17日(金) 16:23
by たいちう
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関数の利用
Posted: 2008年10月17日(金) 16:42
by 管理人
atan2の利用方法について聞いているような題名ですが、
そうではなく、角度からx,y成分を計算する方法が知りたいという事でしょうか?
Re:atan2関数の利用
Posted: 2008年10月20日(月) 16:40
by 匿名
知りたいのは両方ですが、atan2の引数と戻り値、あと戻り値をXY座標に反映させているのはどの部分かです。
Re:atan2関数の利用
Posted: 2008年10月20日(月) 17:28
by 通りすがり
回答してくれた内容読んでないんでしょうか?
Re:atan2関数の利用
Posted: 2008年10月20日(月) 17:33
by たいちう
> 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関数の利用
Posted: 2008年10月21日(火) 16:24
by 匿名
すいません読解力がなくて・・・
cshot[k].angle=atan2(y,x);
これのx,yは何の座標でしょうか?
あとcshot[k].angleに戻り値が入るのはわかりますが
atan2の戻り値は何ですか?x,yに対するcosですか?
Re:atan2関数の利用
Posted: 2008年10月21日(火) 16:43
by 御津凪
atan2 の戻り値は 角度(ラジアン)です。
この角度は対象先への角度となります。
atan2 に渡されている x,y は、対象元の座標 - 対象となる座標です。(逆かも?)
Re:atan2関数の利用
Posted: 2008年10月21日(火) 17:13
by たいちう
> 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関数の利用
Posted: 2008年10月21日(火) 19:40
by 匿名
よくわかりました
ところで
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関数の利用
Posted: 2008年10月22日(水) 09:36
by たいちう
中心が原点、半径rの円の座標は次の式で表せます。
x = r * cos(θ)
y = r * sin(θ)
(0 <= θ <= 2 * π)
上式のrに該当する部分が、cshot.spd。
θがcshot.angleです。
上式は静止した座標を扱っています。
速度の概念を次の式であらわせられます。
新しい座標 = 元の座標 + 微小時間 * 速度
HPの説明を読んでいませんが、きっと微小時間(単位時間?) * 速度が
spdに代入されていると考えてよいでしょう。
これらの式を組み合わせると、件の式になるわけです。
Re:atan2関数の利用
Posted: 2008年10月22日(水) 15:06
by 管理人
>これってどこが関数なのか変数名かよくわかりにくいですね
関数は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関数の利用
Posted: 2008年10月22日(水) 16:02
by 匿名
そうですね一度教科書を見直します