三角関数
 ここでは、2D/3D概念を扱う上で避けて通れない三角関数について、ピタゴラスの定理やラジアン角からアークまで説明します。ピタゴラスの定理は初等数学、アークは大学数学であり、途中で分からないところが出たとしても当然ですが、実際に試しながら習得すれば、あっという間にアークまで使用できるようになります。
参考資料:元のブログ記事

 以下に記す文章はおそらく勉強用の読み物としては不適です。ここで三角関数を(再)習得したいのであれば、何でも良いので実際に動かしてください。C、Java、PHP、JavaScript、SQL、Excelなど、言語は何でも構いません。とにかく動かすことが重要です。
 参考までに、Cではmath.hをインクルードし、Javaではjava.lang.Mathクラスを使います。PHPの円周率はM_PI定数です。Excelではそのまま三角関数と同名の関数を使えますが、後で述べるATAN2のみは他の言語と引数の順番が逆である点に注意が必要です。
 ではまず基本から。最初に習得すべきは「ピタゴラスの定理」と「ラジアン」でしょう。ピタゴラスの定理とは、もともと直角三角形の斜線の長さを他の2辺の長さから求めるものなのですが、これを利用すればX,Y座標のみのデータから線の長さを求めることができます。以下に式を示します。
X : X 座標
Y : Y 座標

=SQRT(X^2+Y^2)
 Excelならこれで大丈夫です。JavaなどではXとYをpow()を使って2乗するか、もしくは「X * X」などと記述してください。これで得られる値が線の長さになります。実際に適当な値を入れて試してみてください。
 次にラジアン角について。これは単に角度の180度を円周率、360度を円周率の2倍といった具合に、円周率を基準に角度を定義するという単純極まりないものです。求め方はこちら。
DEG : Degrees 角(1周を360度とする角度表現)
=DEG*PI()/180

・ラジアンを元の表現に戻す逆算
RAD : ラジアン角
=RAD*180/PI()
 これで通常の角度をラジアンに変換できます。ただ、いちいちこの式を記述して回るのは手間ですので、可能なら最初からラジアン角で記述した方が楽です。
式	角度
=PI()*2	360
=PI()	180
=PI()/2	90
=PI()/4	45
=PI()/8	22.5
 では本題の三角関数を。
 三角関数といいますのは、線の長さを1とした場合に、その線を指定した角度の方向に引くと、線の先端がどの位置に置かれるのかを算出するものです。この角度のことを「シータ」(Theta)と呼び、線の先端のX座標を求めるのがCOS、Y座標を求めるのがSINです。TANは単に「SIN / COS」を演算するだけです。
 シータが0度の場合に線が伸びる方向は真右であり、度数が増えると反時計回りに回転します。例えばPI()/2であれば、これは角度にして90度ですから、真右を向いた線を反時計回りに90度回転させ、真上を向くことになります。SIN及びCOSは長さ1の線のX及びY座標を求めているわけですから、これをピタゴラスの定理にかけると必ず1になります。
THETA : ラジアン角

=SQRT(SIN(THETA)^2+COS(THETA)^2)
 COS及びSINの性質を理解するには、これらをひたすら打ってみることです。ExcelでもCでも構いませんので、徹底的に打って実験してみましょう。なお、COS及びSINに渡すシータはラジアン角ですので、その点にはご注意ください。以下のようなシートを作成し、「角度」の値を色々と変えて実験してみると良く分かります(ここの「角度」には通常のDegrees角を使用します)。これはExcelの「A1」部分に貼りつけてそのまま使用できます。
角度	45
RAD	=B1*PI()/180
COS(X)	=COS(B2)
SIN(Y)	=SIN(B2)
 三角関数の性質を図にすると、以下のようになります。


 COSやSINと書くと難しそうですが、単にCOSがX座標、SINがY座標です。スクリーンと違い、数学上のY座標は上に行くほど数値が大きくなります。

 最初に「COSがX座標、SINがY座標」と覚えておくと絶対に忘れません。3DではCOSがYになったりZになったりするのですが、2DにおいてはCOSはXです。シータが0度の状態では線は真右であるため、COS(X座標)は1、SIN(Y座標)は0ということになります。
 さて、COSやSINが「長さ1の線のX,Y座標」を求めるものであることは上で述べましたが、それでは長さ10や20といった線の座標を求めるにはどうするのでしょうか。これは非常に簡単であり、単にCOSやSINの値に線の長さを掛けるだけです。
長さ 20 の線を 45 度(PI/4 ラジアン)回転させた際の X 座標
=COS(PI()/4)*20
 何とも簡単なことに、これでかの悪名高い三角関数(サイン・コサイン・タンジェント)は修了です。お疲れ様でした。と言いたいところですが、これを習得する際には必ず同時にアークも習得しておくべきでしょう。アークはこれらの逆関数であり、COSやSINの値からシータを求めることができます。本来は大学数学なのですが、プログラム言語や表計算を持っていれば関係ありません。平然と使えてしまう上、非常に簡単です。
 アークにはASIN、ACOS、ATANに加えてATAN2があり、最初の3つは単なる逆算です。つまり、以下の式が成り立ちます。
THETA : 適当なラジアン角
THETA = ACOS(COS(THETA))
THETA = ASIN(SIN(THETA))
THETA = ATAN(TAN(THETA))
 アークの存在が意味するところは、何らかの点のX,Y座標からシータを得る術があるということです。つまり、三角関数による変換は決して一方通行ではないのです。足し算の対となる引き算、掛け算の対となる割り算のようなもので、これは非常に重要です。
 ただし、これらの3つの関数には限界があり、ACOSなら0〜180度、ASINやATANなら-90度(270度)〜90度といった具合に、半径までしか求めることができません。というのは、例えばACOS(1)の場合、COSは0度の場合にも180度の場合にも1になりますので、どちらであるのかを判別することができず、0度とみなされます。同様にASIN(0.7071...)のような場合も、SINは45度でも135度でも0.7071...になりますので、どちらかを判別することができず、45度とみなされます。ATANに関しても同様で、例えばYが1、Xが1(45度)ならATAN(Y/X)ですからATAN(1)になりますし、Yが-1、Xが-1(225度)でもやはりATAN(1)となるため、こちらも判別できずに45度とみなされることになります。
 ではここで実際に問題を解いてみましょう。X40、Y20の位置に点があるとしましょう。ACOS、ASIN、ATANのいずれかを用い、この点の角度(シータ)を求めてください。1つヒントを出すなら、アークが各三角関数の逆算であることを考えてください。ASIN、ACOSの場合、SIN、COSでは得られた結果に線の長さを掛けていましたが、逆算では一体どうなるのでしょうか。先に述べたピタゴラスの定理を使います。ATANの場合はもっとスマートに求められます。こちらもTANの逆算であることを良く考えてください。もしピタゴラスの定理、COS、SIN、TANなどの定義を忘れているようなら、戻って確かめても構いません。答えを見る前に一通り考え、できればExcelなどで答えを作ってみてください。

 それでは以下に答えを述べます。ASINとACOSはそれぞれSINとCOSの逆関数であり、SIN、COSともに結果に対して線の長さを掛けているのですから、逆算をするならこうなります。
THETA : シータ
LINE : 線の長さ

・SIN/COS
X = COS(THETA) * LINE
Y = SIN(THETA) * LINE

・逆算
THETA = ACOS(X / LINE)
THETA = ASIN(Y / LINE)
 問題ではXが40、Yが20ですから、XとYの値は分かっています。問題はLINEの値ですが、線の長さはピタゴラスの定理で求められることを先に述べました。つまり、
LINE = SQRT(X^2+Y^2)
 となります。これを踏まえて式を作れば、
=ACOS(40/SQRT(40^2+20^2))
=ASIN(20/SQRT(40^2+20^2))
 であり、どちらの方法でも0.4636...という結果が得られます。これはラジアン角ですから、Degrees角に直せば26.565...度です。
 ATANの場合はもっと簡単です。まず、TANが次のようなものであることはすでに述べました。
TAN = SIN / COS
言い換えれば
TAN = Y / X
 そして今回、すでにXとYの値はそれぞれ40と20であることが分かっています。これを逆算するだけなのですから、Y/Xすなわち20/40であり、
=ATAN(20/40)
 となります。やはり先ほどと同じく0.4636...という結果が得られます。
 ASINやACOSは単純にSINやCOSを逆算する場合(例えばベクトル内積から角度を求める際にはACOSを使用)に便利であり、ATANは特定の点の角度を知るために用いると便利です。ただ単に特定の点のシータを求めるだけであれば、大抵の場合はATANがあれば事足りるでしょう。
 しかし、ATANには落とし穴があります。TANは「Y/X」によって表され、ATANも「ATAN(Y/X)」として演算しましたが、もしXがゼロであった場合にはどうなるのでしょうか。当然、これではゼロ除算が発生してしまいます。これでは非常に困りますから、何とかしなければなりません。かといって、ATANを使うたびにゼロ除算をチェックするのでは大変手間がかかります。また、ATANでは-90度〜90度の値しか得ることができず、不便であることは否めません。
 特に後者に関しては、前述の通りACOSやASINも同じ問題を抱えており、ACOSはシータが0度〜180度(0〜PI)の範囲、ASINやATANは-90度〜90度(-PI/2〜PI/2)の範囲である限りは正しく動作するのですが、もしそうでない場合、例えばACOSなら360度から実際の角度を引いた数(例えばシータが225度なら360-225で135度)などという正しくない値が返されてしまいます。
 そのために用意されているのがATAN2です。これを使えばXが0の場合にもゼロ除算を起こさずに計算することができ、しかも-180度〜180度(-PI〜PI。すなわち360度)の範囲で値を返してくれます。この最終兵器・ATAN2は2つの引数を取るのですが、注意したいのはその順番です。何と各種プログラム言語とExcelでは引数の順番が違っているのです。非常に便利な関数なのですが、この点にだけは注意が必要です。
・ATAN による記述
=ATAN(Y/X)

・同じ式を ATAN2 で記述(Excel の場合)
Excel では X,Y の順番に引数を取る
=ATAN2(X,Y)

・C/C++,Java,PHP,SQL,JavaScript などでの atan2
これらでは sin,cos の順番に引数を取る
atan2(Y,X)
 非常に強力な関数ですので、ぜひとも使いこなしましょう。ただし、XとYの両方がゼロであれば、さすがのATAN2もゼロ除算を起こしてしまいます。
 ATAN2は単に「X座標とY座標からシータを算出する」だけの関数ですから、ここまでの三角関数を習得できた方なら特段問題なく習得できるでしょう。ATANよりATAN2の方がゼロ除算を起こさない点、360度全角度を求めることができる点で優れていますので、点の位置からシータを求めたければATAN2が基本です。

 もう1つ、三角関数といえば忘れてはいけないのが「回転」です。ここに特定の点があるとして、これを45度回転させたらどの位置になるか、といったことを求めるにはどうすれば良いのでしょうか。
 45度のものを正方向に45度回転させたら90度になる。これは当然です。したがって、「7.071...,7.071...」(Degrees角で45度、ラジアン角でPI/4の値をSIN及びCOSにかけると0.7071...が得られる。線の長さが10なら、これらはそれぞれ7.071...となる)の点を45度回転させると「0,10」になります。それをさらに45度回転させれば「-7.071...,7.071...」であり、さらに45度回転させると「-10,0」です。
 ではここで問題です。ここにX10,Y20の点があるとしましょう。これをラジアン角にしてPI/4度回転させると、新しい座標はどこに置かれるのでしょうか。新しい座標を求める式をExcelでもCでも何でも構いませんので作成してください。ただし、その式にはATAN2を使用してください。ヒントは「ピタゴラスの定理」です。ATAN2に線の長さは不要ですが、SINやCOSを使用する際にはどうしても必要になります。

 では模範解答を。要は現在の角度にPI/4度を足すわけですから、まず現在の角度をATAN2で求めます。角度が分かったら、それにPI/4を加算し、それをSIN及びCOSに渡すだけです。SIN及びCOSには線の長さを掛けなければなりませんので、ピタゴラスの定理を使って線の長さを求めます。式をX,Yそれぞれ1行で表せばこうなります(Excelの場合の記述。CやJavaなどを使用している場合はATAN2の引数の順番が逆になります)。
X : 10
Y : 20

=COS(ATAN2(10,20)+PI()/4)*SQRT(10^2+20^2)
=SIN(ATAN2(10,20)+PI()/4)*SQRT(10^2+20^2)

すなわち
X : -7.071...
Y : 21.213...
 これだけで回転でも何でもできてしまうのですから、大変便利です。
 また、回転にはATAN2を使わない方法もあります。これはマトリックスによる方法で、単に演算するだけならこちらの方が簡単でしょう。式にするとこうなります。
RAD : 加算するラジアン角

New_X = COS(RAD) * X + -SIN(RAD) * Y
New_Y = SIN(RAD) * X + COS(RAD) * Y
 実際に先ほどのデータにこれを適用すると、
=COS(PI()/4)*10+-SIN(PI()/4)*20
=SIN(PI()/4)*10+COS(PI()/4)*20
 このような式になり、これでATAN2の場合と同じ値を得ることができます。
 以上、これでアークも含めて三角関数を習得できたことになります。三角関数は実際には難しくないことがお分かりいただけたのではないでしょうか。Excelやプログラム言語を使い、色々と試してみてください。
 せっかくですから3Dも少しだけ。これは三角関数とは別の概念が入ってきますので、特に覚える必要はありません。2Dの三角関数では「COSがX座標、SINがY座標」であると述べましたが、3Dでは必ずしもこの通りとは限りません。正確には「可変」です。具体的には、2DではXとYしかありませんでしたが、3Dではそれに奥行きのZ座標が加わり、2DではX,Yの回転しか存在しなかったのが、3DではX,Y、Y,Z、Z,Xの3種類の回転(それぞれZ軸、X軸、Y軸の回転と呼称)が存在します。
 COS及びSINの表す座標は、以下の表の通りに変動します。
回転軸COSSIN
XYZ
YZX
ZXY
 パターンを覚えてしまえば簡単です。座標の順番を「X -> Y -> Z -> X -> ...」とするなら、回転軸+1の座標がCOS、+2がSINであるといえます。