ゲームづくりの 数学 基礎 メモ
ゲームを実装しているときに考えた 数学の基礎知識 について すぐ忘れてしまうので, メモを書いていきます
3D の回転とかじゃなくてもっと初級の高校生レベルのものとなります
プログラムを利用する場合は lua ( defold ) となります
ラジアン
角度の単位
半径 1 の円の円弧の長さで示される角度
180度が π ラジアン
360度が 2π ラジアン
プログラムでは基本的に角度はラジアンを用いる
π
円周率
直径に対する円周の比率
つまり, 直径 1 の円の円周の長さ
3.14159265... のこと
半径 1 の円周の長さは 2 π
sin ( サイン )
注) sin, cos, tan について, 位置関係などは 図解入りの wikipedia などを参照
ある角度に対して 直角三角形 を想定し, その 斜辺の長さ に対する 高さ(縦の長さ) の比
比なので 直角三角形 の大きさは問わない
そこで, 斜辺を半径 1 の円の半径にあてはめてみると, 次のように読みとれる
角度を半径 1 の円の座標で表したときの y 座標
角度に対して, その単位ベクトルの y 座標
cos ( コサイン )
ある角度に対して 直角三角形 を想定し, その 斜辺の長さ に対する 底辺(横の長さ) の比
比なので 直角三角形 の大きさは問わない
そこで, 斜辺を半径 1 の円の半径にあてはめてみると, 次のように読みとれる
角度を半径 1 の円の座標で表したときの x 座標
角度に対して, その単位ベクトルの x 座標
tan ( タンジェント )
注) tan は本質的にはここでそれほど重要ではありませんが念のため記述
ある角度に対して 直角三角形を想定し, その 底辺(横の長さ) に対する 高さ(縦の長さ) の比
比なので 直角三角形 の大きさは問わない
角度を x, y 座標で示したときの y / x の値
座標から角度を得る
上述のように sin, cos を用いれば 角度を 半径 1 の円の座標で表すことができる
というよりも, ここまで学習すると, 角度 と 座標 を橋渡しするために考案されたものが sin, cos であったのだと 逆に分かってくる
マイナス座標も考慮し, x, y 座標(cos, sin) を組み合わせると,
角度から座標の対応は一意に決まる
よって 座標から角度への逆変換も可能である
この逆変換を行う関数が arc sin, arc cos ( アークサイン, アークコサイン ) となる
プログラムではふつう atan2(y, x) を使う
関数名がアークタンジェントだが, これは内部的には arc sin, arc cos の組み合わせからの算出 と思われる
つまり, 関数名が アークタンジェント であるものの, 内部的は atan( y / x ) で求めているわけではないはず
なぜなら atan2() は一意に決まるため
atan() は一意には決まらない
180度逆の角とどちらか不確定となる
> math.atan2(0, -1)
3.1415926535898
座標から 単位ベクトルを得る (平面)
上述のように座標から角度を得ることはできるので, その角度の cos, sin を取れば単位ベクトルとなる
三角関数を用いず, 三平方の定理から斜辺の長さを取って, その比で求めてもよい
$ cat unit_vec.lua
x = 3
y = 4
r = math.atan2(y, x)
ux = math.cos(r)
uy = math.sin(r)
print(ux, uy)
z = math.sqrt(x^2 + y^2)
ux = x / z
uy = y / z
print(ux, uy)
$ lua unit_vec.lua
0.6 0.8
0.6 0.8