代数・幾何
概要
- プログラミングで使いそうな代数・幾何の備忘録
- Python および numpy で紹介
三角関数
- 円関数ともいう。
- 円の中の半径と X 軸、円との接点からの垂線で構成される三角形の距離的な関数 (一部の長さや角度が分かれば、その他の長さや角度が分かる)。
- というか、円で考えたほうが三角関数は実は理解しやすい。
- $\sin \theta$ (サイン; 正弦)
- $\sin \theta = \frac{y} {r}$
- 半径 (直角三角形の斜めの辺) の長さ $r$ と角度 $\theta$ と 高さ $y$ の関係。
- たいていは、半径と角度から、高さを求める時に使う。
- $\cos \theta$ (コサイン; 余弦)
- $cos \theta = \frac {x} {r}$
- 半径 (直角三角形の斜めの辺) の長さ $r$ と角度 $\theta$ と幅 $x$ の関係。
- たいていは、半径と角度から、幅を求める時に使う。
- $\tan \theta = \frac {y} {x}$ (タンジェント; 正接)
- 角度 $\theta$ と幅 $x$、高さ $y$ の関係。
- $x$ (幅) と $y$ (高さ) と角度の関係。
- 二次関数の傾きと同じ定義。
内積
- ベクトル同士の積のうちの一つ。
- 結果はスカラーになる。
- ベクトル A と B の内積は、ベクトル B のベクトル A 上の投影したときの距離。
- 結果が 0 の時、2 つのベクトルは垂直に交わる ()。
- 使いどころ
- ベクトル (あるいは、直線を表現したベクトル) が垂直に交わっているかの判定に使う。
- 内積の関係から、2 つのベクトル間 ($\vec{u}$ と $\vec{v}$) の角度算出に使う。
$$\begin{eqnarray} \cos \theta &=& \frac {\vec{u} \cdot \vec{v}} {\|\vec{u}\| \| \vec{v} \|} \\ \theta &=& \arccos \left( \frac {\vec{u} \cdot \vec{v}} {\|\vec{u}\| \| \vec{v} \|} \right) \end{eqnarray}$$
- $\vec{u} \cdot \vec{v}$: $\vec{u}$ と $\vec{v}$ の内積
- $\|\vec{u}\|$: $\vec{u}$ のベクトルの大きさ (長さ; スカラー)
- $\|\vec{v}\|$: $\vec{v}$ のベクトルの大きさ (長さ; スカラー)
- ただし、第二象限までしか算出できない (0〜180 度)
- 第二象限以上を算出する場合は、外積を使って、ベクトル $\vec{u}$ と $\vec{v}$ の関係 (どちらを基準に時計回りか、反時計回りか) を調べて、0〜180 度 (第一、第二象限) と -180〜0 度 (第三、第四象限; 外積の Z 成分が負) として実装する。
- Python での実装
import numpy as np u = np.array([1,0,0]) v = np.array([1,1,0]) cos = np.clip(np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v)), -1.0, 1.0) theta = np.arccos(cos) if np.cross(u, v)[2] < 0: theta *= -1 deg = np.rad2deg(theta) print(deg)
外積
- ベクトル同士の積のうちの一つ。
- 結果はベクトルになる。
- 3 次元ベクトルの外積は、平面に対する法線ベクトルになる。
- 外積の Z 成分が正なのか負なのかによって、ベクトルの関係が分かる ($\vec{u}$ と $\vec{v}$ の外積で、Z 成分が負の場合、$\vec{v}$ は $\vec{u}$ の右側 (反時計回り) にある)。
- この関係は右ねじの法則で覚えると良い (2 つのベクトルの回転中心に握った右手を置いた際、指の付け根が外積の最初のベクトル側 ($\vec{u}$)、指先が次のベクトル側 ($\vec{v}$) になり、指の向きが回転方向、親指の向きが Z 成分になる。)。
- 使いどころ
- 平面の法線ベクトルの生成。
- 角度算出の際の第三、第四象限の判定。