プチコンまとめWiki (初代/mkII)

ナビゲーション

ウィキ メニュー  :  編集 - 差分 - 添付 - 新規 - 検索 - 一覧 - 新着 - ヘルプ

三角関数の使い方

パンくずリスト

概要

  • このページにお越しの皆様こんにちは。
  • ここには図形やシューティングゲームなどで使うことのある三角関数について書きました。
  • 加筆・訂正してくれる人大歓迎です。ぜひお願いします。

お膳立て

みなさんは三角関数を知っていますか?説明書を見ても「何のこと言ってんだかさっぱりわからん」「そんなことよりサッカーしようぜ」
という人もいるんじゃないかと思います。でも、そこであきらめないでください。更に高度なプログラムを作りたいと思っている初心者、中級者の皆さん、このページを読めば三角関数が使えるようになる(はずです!)
ということで、三角関数についてざっくばらんではありますが、解説しようという趣旨のページをつくりました。
是非活用してください。

三角関数とは

これは、高校の数学で習うやつです。よくcosθ(コサインシータ)とか聞きますよね。~聞いたことないですか?大丈夫です。このページを何度も読めばわかるはずです。
三角関数とは、角度やx,yの移動量の関係を求める関数です。*1「関数」というという名前の通りある値に対して違う数値を出してくれます。
使い方としては、スプライトで弾を四方八方に発射させたり、キャラを動かしたり 時計やメーターで針を書くのに使ったりもします。
記述の方法は式の中に挿入する形で書きます。参考プログラムを参考にしてください。
これを使えるようになるととても便利です。本格シューティングゲームなんかも作れるんじゃないでしょうか。

使い方

プチコンでの三角関数に関係する関数は以下の種類があります。
PI(パイ)関数
RAD(ラジアン)関数
DEG(デグリー)関数
COS(コサイン)関数
SIN(サイン)関数
TAN(タンジェント)関数
ATAN(アークタンジェント)関数
今載っていない項目の加筆者募集中!!

PI関数

そのまんまです。中学で習うπの値(円周率)(3.14159265358979323846264338....)を返してくれます
でもプチコンは小数の精度が悪いので実際3.141ぐらいまでしか出してくれません。

しかし、実はその下の「3.1415」付近までプチコンの内部では記録されています。
ちなみに変数に3.14159265・・・を代入しても、「3.1415」を代入したときや、「PI()」を代入したときとまったく同じです。
ただし、「3.141」を代入した時とは違うので注意です

使用例です。

  1. CLS
  2. P=PI()
  3. R=4
  4. S=P*R*R
  5. L=P*R*2
  6. PRINT”ハンケイ4cmノエンノメンセキ”;S;”cm2
  7. PRINT”ハンケイ4cmノエンノエンシュウ”;L;”cm


RAD,DEG関数

この関数は角度(degree)とラジアン(radian)の変換をする関数です。
ラジアン数とは円周上でその円の半径と同じ長さの弧を切り取る2本の半径が成す角の値(wikipediaより)らしいですが、うーむわかりづらいですね。
まあ角度の単位の一つだと思ってください。
ちなみに180°= π rad
1 rad=57.29577951°
です。 使い方は、
角度→ラジアン:RAD(角度0〜360)
ラジアン→角度:DEG(0〜2π)
です。*2

2013/12/06追記
RAD関数では小数点以下の数値は無視されてしまうようです。小数点以下の数値も使う場合はPI()を用いて計算で求めてください。

COS,SIN関数

この関数は角度から移動量を求めることができる関数です。

この関数に角度を渡すと
COS関数ならXの移動量
SIN関数ならYの移動量
を返します。
引数には角度をラジアン数で表します。


ラジアンの求め方
ラジアン=RAD(角度0〜360)
で求められます。
注意:0度は右方向でそこから時計回りになっています。90度で真下になります。
円だ.png


この関数を使って斜め線を引くと直線と距離を合わせることができます。

  1. GPAGE 0
  2. GCLS
  3. CX=0:CY=0
  4. LX1=CX+50:LY1=CY
  5. LX2=CX+COS(RAD(40))*50
  6. LY2=CY+SIN(RAD(40))*50
  7. GLINE CX,CY,LX1,LY1,2
  8. GLINE CX,CY,LX2,LY2,2

図解です
三角関数解説.png

関数自体の返す値は小さい(0~1)ので実際にプログラムに使うときは掛けて大きくして使用します。

参考プログラムその1
・入力した角度にキャラが動く

QRコード(COSTEST)
qr0.PNG
+  プログラムリスト

入力した角度通りにキャラクタを移動させます。この移動に三角関数を使っています。
ここで三角関数を使うとどの角度に動かしても同じ長さだけ動かすことができます。 これを使いこなせばかなり多用できると思います。
例えば弾を四方八方に打ち出すときにこの関数を使うと放射状に綺麗に広がります。

参考プログラムその2

QRコード(COSTEST2)
qr1.PNG
+  プログラムリスト

ぐるぐると弾を打ち出すプログラムです。綺麗に弾が移動しているのが分かると思います。
この関数は他にもメーターを描くときなどに使用できます。

まとめ

  1. COS,SIN関数を使うと斜めの線を描画できる。
  2. COS,SIN関数には引数にラジアン数(RAD(角度))を使う。
  3. 使うときは使う長さの分掛けて使用する。
  4. SPRITEと斜めに移動させる時の移動量に使える。

まあ、習うより慣れろって感じですね。自分でプチコンいじって頑張って見てください。
例えばサンプルプログラムのバイオリズムとか、ゲーム3のSIMPLE STGとか、色々あるよ。公式のプログラムは解説付きなのできっと味方になります。

もっとCOS,SIN関数

波形について利用法などを書きます。

波形

COS,SIN関数を使うとなだらかな波形を描くことができます。
波形は360°で1周期となります。よって
360/周期の長さ とすることで自由な周期の波形を描くことができます。

サンプルプログラム

QRコード(SINTEST)
SINTEST.PNG
+  プログラムリスト

タッチで1周期の長さを変えることができます。ちなみにCOS関数を使うとちょうど90度分ずれることになります。
これの応用として、サンプルプログラムのバイオリズムがあります。周期がそれぞれ違っているのが見てわかると思います。

楕円を描く

こちらの内容は当ウィキサンプルプログラム集からいただいています。

三角関数を使うと原点から同じ距離の点を求められるのでその点同士を結ぶことで円ができます。更に、COS,SIN関数の掛ける値を変えることで楕円をかくことができます。

サンプルプログラム

QRコード(ELLIPSE)
ELLIPSE.PNG
+  プログラムリスト

FORループ内にWAITを入れるとどういうふうに書いているのかわかると思います。

TAN関数

この関数は傾きを返すための関数です。
「傾き」ってわかりますか?中学生で習いましたよね。(まだ中学生じゃない人もいるかも・・・)

そんな人のためにグラフを用意しました〜。
傾きってなんだっけ?.png
はい、わかりましたか?まあいいんです。なんとなくわかれば。
なんか中学校の授業っぽいですね。まあグラフは学校でもプログラムでも重要ですし。

話がそれました。閑話休題。

さてTANはどのようになるのか。ここまで説明したように下の図のようになります。
tanってなんでっけ?.png
わかりましたでしょうか?つまりsin(yの変化)のcos(xの変化)に対する比=直線の傾きということです。なので90°、270°の時は0で割ることになるので値が出ませんね。

ATAN関数

この関数は他のと名前が少し違いますね。アーク+タンジェントです。
じつはこの種類、他にもアークコサイン、アークサインがあります。
つまり他の関数と対になっていて逆三角関数とも言われますが、どうなっているのでしょう。

この関数はいままでの関数と逆の働きをします。
これまでの関数はすべて角度がわかっていました。しか〜し。やはりプログラムの中でXとYの変化はわかったけど角度がわからん。なんてシチュエーションもあるでしょう、その時はこの関数を使います。
スラマッパギー.png
使い方は

角度のラジアン数=ATAN(yの移動量÷xの移動量)
または
角度のラジアン数=ATAN(yの移動量,xの移動量)
でもとめられます。

この引数が1つの書き方と2つの書き方では結果が少々異なります。
上の図で考えてみましょう。Xが80増えてYが40増えているから引数が1つの書き方で書いてみるとこうなります。

  1. ?ATAN(40/80)
  2. 0.464
  3. OK

では、Xが80減ってYが40減っているときはどうでしょう?

  1. ?ATAN(−40/−80)
  2. 0.464
  3. OK

同じ結果になってしまいました。どちらも引数に0.5を渡しているだけなので当然ですね。
では引数が2つの書き方(巷ではATAN2とも呼ばれています)を見てみましょう。

  1. ?ATAN(40,80)
  2. 0.464
  3. OK
  4. ?ATAN(−40,−80)
  5. −2.678
  6. OK

この2つの差は3.142となり、丁度π(180°)逆を向いていることがわかります。
つまり、線の向きを気にしない時は引数が1つ、気にする時は引数が2つの書き方がおすすめです。
また、Xの変化量が0になるかもしれない時も引数が2つの書き方の方がおすすめです。(0除算のエラーが発生しません)

ATANの返す値の範囲は以下の範囲になります。

引数範囲
ラジアンデグリー
1つ-π/2 〜 π/2-90°〜 90°
2つ-π 〜 π-180°〜 180°


サンプルプログラム

QRコード(ATANTEST)
ATANTEST.PNG
+  プログラムリスト

プレイヤーとターゲットの角度を測り、30°以上であれば旋回してターゲットに向かいます。公式サンプルプログラムのGAME4のミサイルなどはこの関数を使っています。つまり追尾ができるということです。

質問コーナー

関係ないことを書き込んだ場合削除します。あしからず。

  • いったん : まめちしき投稿してみました。いろいろと違うところがあるかもしれませんが直していただけると嬉しいです。 (2012/11/24 (土) 00:16:18)
  • melville : ちょっといじってみました (2012/11/24 (土) 07:22:39)
  • 名無しさん : cosとsinで円かけるぞ (2013/04/05 (金) 13:37:54)
  • いったん : ↑活用法とかあったら是非付けたしていってください。編集は自由なので。 (2013/04/05 (金) 14:56:01)
  • ゆうあし : 3DSからだから編集できないのでここに書きます。 ・ラジアンについて。 半径1の扇形を想像して下さい。その時の弧の長さは「直径(2)*π*(角度/360)」ですよね。この時、角度は弧の長さで表せられます。ちなみに360°のような角度の表し方を「度数法」、2πのような「弧度法」と言います。 (2013/11/30 (土) 14:54:45)
  • ゆうあし : 説明力ほしい…。ちなみに90°=1/2π、180°=π、270°=3/2π、360°=2πの筈です。説明書にも書いてありますが一応。 (2013/11/30 (土) 14:58:03)
  • 名無しさん : ATANの違いについて追記してみました。文章力には自信はないので校正なり全ボツなりご自由にどうぞ (2013/12/07 (土) 04:12:08)
  • : DEG(ATAN(敵x,敵y))で求めた角度と同じ角度で進んでも敵にぶつからない...なぜ...(スプライト) (2014/01/21 (火) 20:16:02)
  • いったん : ATAN関数の引数は(敵y-自y,敵x-自x)です。確認してください。 (2014/01/21 (火) 20:30:39)
  • : お、ほんとだ、ありがとうございます>いったんさん (2014/01/21 (火) 21:09:28)
  • : ん、でも自機が敵よりもyの数字が大きかったら敵の方向に行きませんねえ、ずっと回ってばっかりで (2014/01/21 (火) 21:18:28)
  • 今は名無し : 三角関数で渦巻き描けた (2014/04/20 (日) 18:41:07)
  • 名無しさん : 勉強になりました^ - ^ (2014/05/20 (火) 00:51:07)
  • 名無し : arcsinの解説と使い方お願いします (2014/09/05 (金) 15:44:15)
  • 名無しさん : ↑逆正弦関数(arcsin)はプチコンにはなかったと思うけど (2014/09/05 (金) 17:22:30)
  • 名無しさん : arcsinはATANを元に計算できる (2014/09/05 (金) 18:21:35)
  • 12さいくん : TANのとこに「中学で習った」って書いてあるけど、小6で習った (2014/11/16 (日) 20:24:25)
  • 名無しさん : 追尾できるとか胸熱 (2017/03/10 (金) 04:03:56)
  • 名無しさん : 追尾できるとか胸熱 (2017/03/10 (金) 04:03:57)

*1 まあそれだけじゃありませんけど
*2 ラジアン=角度*PI()/180 , 角度=ラジアン/PI()*180でも求められますが、精度に不安があるためおすすめしません。

PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.051 秒 | このページの最終更新 : 2017/03/10 (金) 04:03:57 (47d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30