今章は、三角関数を扱う数学関数の紹介を行います。 もし、おかしい表現等がございましたらご報告願います。 尚、「ラジアンとは」等の言葉の意味について、軽く触れる程度で詳細には説明しません。 詳しく知りたい場合は、他の専門的なページを検索し、そちらで調べてください。 初めにHSP命令ではなく、三角関数側の説明を少しだけしておきます。30(60)度の直角三角形は、辺の長さの比が1:2:√3で、 45度の直角三角形は、1:1:√2と学校で習いました(または、これから習います)ね。 サイン(正弦)30は2分の1、コサイン(余弦)30は2分の√3、タンジェント(正接)30は√3分の1、 サイン45は√2分の1、コサイン45も√2分の√3、タンジェント45は1、 サイン60は2分の√3、コサイン60は2分の1、タンジェント60は√3というのもありました。 さて、このサインX度や、コサインY度という表記は、 「円周を360等分した弧の中心に対する角度」を基本の単位とする度数法です。 360という数は1〜10のうち割り切れないのは7だけ、と約数が多く除算しやすい数であるものの、 それは数学においては重要な要素ではないということで、一般的には度数法を用いるのではなく、 「円の半径に等しい長さの弧の中心に対する角度(平面角)」を単位とする 弧度法(ラジアンで測ること)を代わりに用いるようです。 ラジアンというのもまた角度の単位で、度数法の360度が2πラジアンになるということから、 1ラジアン(=360/2π)は、約57.295779度になり、 ラジアンから度への変換は「ラジアン×180÷π」で近似値を求められるわけですが、 HSP3.2β4からはhspmath.asより標準マクロとして移行された下記関数で変換できます。
| 角度 = rad2deg(ラジアン角) | |||
| 角度 | 変換後の角度受取先を指定する。 | ||
| ラジアン角 | 弧度法によるラジアンを単位とした実数値を指定する。 | ||
| ラジアン角 = deg2rad(角度) | |||
| ラジアン角 | 変換後のラジアン値の受取先を指定する。 | ||
| 角度 | 変換対象の度数法を単位とした角度を指定する。 | ||
| 正弦値 = sin(角度) | |||
| 正弦値 | パラメータで指定した角度を元にしたサインを返す。 | ||
| 角度 | 弧度法によるラジアンを単位とした実数値を指定する。 | ||
1 2 |
mes 45 * 3.14 / 180 // 整数型で演算 mes 3.14 * 45 / 180 // 実数型で演算 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
height = 0 // ジャンプの高さ(現在位置ではない) power = 10 // ジャンプの速さ(「180÷power−1」回で着地する) speed = 200 // 1回の移動量(最大でspeed座標分上に動く) ground = 300 // 地面の位置(基点) char = 80 // キャラクタサイズ font msgothic, char repeat wait 3 gosub *check gosub *draw loop *draw redraw 0 color 255, 255, 255 : boxf color 100, 50 : boxf , ground + char color , 255 : line , ground - speed, ginfo_winx, ground - speed color , , 255 title str(position) pos 300, position : mes "♀" redraw return *check stick key, 16, 1 // スペースキーが押されたかジャンプ中なら上昇及び下降 if (key & 16) || (height) { height = (height + power) \ 180 // 角度による高さ } position = ground - sin(3.14 * height / 180) * speed // 現在位置の算出 return |
| 余弦値 = cos(角度) | |||
| 余弦値 | パラメータで指定した角度を元にしたコサインを返す。 | ||
| 角度 | 弧度法によるラジアンを単位とした実数値を指定する。 | ||
1 2 3 4 5 6 7 8 9 10 11 12 13 |
repeat 500 redraw 0 x = cos(0.15 * cnt) * 1.0 * cnt + ginfo_winx / 2 // コサインを利用してX座標を決定 y = sin(0.15 * cnt) * 0.9 * cnt + ginfo_winy / 2 // サインを利用してY座標を決定 if cnt \ 10 = 0 { font msmincho, cnt / 10 + 7 // 徐々に拡大させる redraw // 10回に1回だけ描画途中を見せる wait 1 } pos x, y : mes "★" loop redraw dialog "完了" |
| 正接値 = tan(角度) | |||
| 正接値 | パラメータで指定した角度を元にしたタンジェントを返す。 | ||
| 角度 | 弧度法によるラジアンを単位とした実数値を指定する。 | ||
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
x = 100 kaku = 45 objsize 100, 20 pos 10, 10 : mes "X方向の距離" pos 150, 10 : input x, , , 8 pos 10, 50 : mes "角度" pos 150, 50 : input kaku, , , 3 pos 150, 90 : button "Y方向の距離", *calc stop *calc y = tan(3.14159265358979 * kaku / 180) * x // 比率からY距離を求める color 255, 255, 255 : boxf , 150 : color pos 100, 150 : mes "※下はイメージであり、角度も距離も適当です。" pos 30, 395 : mes " ○\n(自分)" color 255 line 50, 400, 350, 400 pos 350, 410 : mes "X方向の距離(" + x + ")" line 50, 400, 350, 200 pos 100, 300 : mes "角度(" + kaku + ")" color , , 255 line 350, 200, 350, 400 pos 360, 280 : mes "Y方向の距離(" + y + ")" |
| ラジアン = atan(Y値, X値) | |||
| ラジアン | X軸と、原点(0, 0)と点(X, Y)を結ぶ直線との角度を弧度法ラジアンで返す。 | ||
| Y値 | 角度形成に必要なY座標値を指定する。 | ||
| X値 | 角度形成に必要なX座標値を指定する。省略時は1指定を意味し、0指定は度数法の90が返る。 | ||
1 2 3 4 5 6 7 8 |
randomize deg = double(rnd(90000)) / 1000 // 90度(小数点以下3桁)以下の乱数を発生 tangent = tan(3.14 * deg / 180) arctangent = atan(tangent) mes "指定角度(度数法)=" + deg mes "タンジェント=" + tangent mes "アークタンジェント=" + arctangent mes "確認角度(度数法)=" + arctangent * 180 / 3.14 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// 顔情報 fs = 60 : es = 16 : ps = 4 // 顔size 目size 黒目size fx = (ginfo_winx - fs) / 2 : fy = (ginfo_winy - fs) / 2 // 顔の中心 lx = 10 : ly = 15 // 左目開始X, 左目開始Y rx = 35 : ry = 15 // 右目開始X, 右目開始Y lcx = fx + lx + (es - ps) / 2 : lcy = fy + ly + (es - ps) / 2 // 左目中心X, 左目中心Y rcx = fx + rx + (es - ps) / 2 : rcy = fy + ry + (es - ps) / 2 // 右目中心X, 右目中心Y // 顔作成 buffer 1 circle 0, 0, fs, fs, 0 // 顔配置 circle lx, ly, lx + es, ly + es, 0 // 左目配置 circle rx, ry, rx + es, ry + es, 0 // 右目配置 line fs / 2, fs / 2 - 5, fs / 2, fs / 2 + 10 // 鼻配置 line 15, ly + es + 10, fs / 2, ly + es + 15 // 口(左部)配置 line fs / 2, ry + es + 15, fs - 15, ry + es + 10 // 口(右部)配置 circle fs, 0, fs + ps, ps // 黒目 // マウス位置を追う gsel 0 repeat wait 5 gosub *geteyeinfo gosub *draw loop *geteyeinfo mx = mousex : my = mousey rad.0 = atan(my - lcy, mx - lcx) // 左目の角度を決定 rad.1 = atan(my - rcy, mx - rcx) // 右目の角度を決定 return *draw redraw 0 color 255, 255, 255 : boxf fx, fy, fx + fs, fy + fs pos fx, fy : gcopy 1, , , fs, fs pos lcx + cos(rad.0) * 5, lcy + sin(rad.0) * 5 : gcopy 1, fs, , ps, ps pos rcx + cos(rad.1) * 5, rcy + sin(rad.1) * 5 : gcopy 1, fs, , ps, ps redraw 1 return |