atan2関数の利用
atan2関数の利用
角度を求めるatan2関数ですが、ホーミングの所などのサンプルプログラムで、求めた角度を使ってX,Yの値をどう変化させているのかがわかりません。そもそもX,Yの値を変化させる処理がどこなのかも分かりません。そのあたりを分かりやすく教えてください。
Re:atan2関数の利用
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関数の利用
> 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関数の利用
すいません読解力がなくて・・・
cshot[k].angle=atan2(y,x);
これのx,yは何の座標でしょうか?
あとcshot[k].angleに戻り値が入るのはわかりますが
atan2の戻り値は何ですか?x,yに対するcosですか?
cshot[k].angle=atan2(y,x);
これのx,yは何の座標でしょうか?
あとcshot[k].angleに戻り値が入るのはわかりますが
atan2の戻り値は何ですか?x,yに対するcosですか?
Re:atan2関数の利用
atan2 の戻り値は 角度(ラジアン)です。
この角度は対象先への角度となります。
atan2 に渡されている x,y は、対象元の座標 - 対象となる座標です。(逆かも?)
この角度は対象先への角度となります。
atan2 に渡されている x,y は、対象元の座標 - 対象となる座標です。(逆かも?)
Re:atan2関数の利用
> 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の増加分)を
引数として渡せば、その角度を返してくれる関数です。
三角関数を理解しましょう。
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関数の利用
よくわかりました
ところで
cshot.x+=cos(cshot.angle)*cshot.spd;
cshot.y+=sin(cshot.angle)*cshot.spd;
の部分ですが
これってどこが関数なのか変数名かよくわかりにくいですね
一体どんな処理が行われているのでしょうか?
cshot.x+=は
X座標=X座標+
cshot.angleは角度ですよね
では
cos()*とcshot.spd;の部分はどういう意味でしょうか?
ところで
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関数の利用
中心が原点、半径rの円の座標は次の式で表せます。
x = r * cos(θ)
y = r * sin(θ)
(0 <= θ <= 2 * π)
上式のrに該当する部分が、cshot.spd。
θがcshot.angleです。
上式は静止した座標を扱っています。
速度の概念を次の式であらわせられます。
新しい座標 = 元の座標 + 微小時間 * 速度
HPの説明を読んでいませんが、きっと微小時間(単位時間?) * 速度が
spdに代入されていると考えてよいでしょう。
これらの式を組み合わせると、件の式になるわけです。
x = r * cos(θ)
y = r * sin(θ)
(0 <= θ <= 2 * π)
上式のrに該当する部分が、cshot.spd。
θがcshot.angleです。
上式は静止した座標を扱っています。
速度の概念を次の式であらわせられます。
新しい座標 = 元の座標 + 微小時間 * 速度
HPの説明を読んでいませんが、きっと微小時間(単位時間?) * 速度が
spdに代入されていると考えてよいでしょう。
これらの式を組み合わせると、件の式になるわけです。
Re:atan2関数の利用
>これってどこが関数なのか変数名かよくわかりにくいですね
関数は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じゃないかもしれません)
関数は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じゃないかもしれません)