平方根を使わずに2次元実ベクトル間の角度を計算する
はじめに
2 次元ベクトル $\boldsymbol{a}=(a_x,a_y)^\top,\boldsymbol{b}=(b_x,b_y)^\top$ の内積が \begin{eqnarray} (\boldsymbol{a},\boldsymbol{b}) &=& \|\boldsymbol{a}\| \|\boldsymbol{b}\| \cos\theta \label{(a,b)} \end{eqnarray} と表せることから、$\boldsymbol{a}, \boldsymbol{b}$ がなす角は \begin{eqnarray} \theta &=& \cos^{-1}\frac{(\boldsymbol{a},\boldsymbol{b})}{\|\boldsymbol{a}\| \|\boldsymbol{b}\|} &=& \cos^{-1}\frac{a_x b_x + a_y b_y}{\sqrt{(a_x^2+a_y^2)(b_x^2+b_y^2)}} \end{eqnarray} で計算できますが、この方法では 7 回の乗算と平方根が必要になってしまいます。
平方根を使わない計算法
式(\ref{(a,b)})を変形すると \begin{eqnarray} \cos\theta &=& \frac{(\boldsymbol{a},\boldsymbol{b})}{\|\boldsymbol{a}\| \|\boldsymbol{b}\|} \end{eqnarray} 両辺を2乗して \begin{eqnarray} \cos^2\theta &=& \frac{\{(\boldsymbol{a},\boldsymbol{b})\}^2}{\|\boldsymbol{a}\|^2 \|\boldsymbol{b}\|^2} \label{cos2} \end{eqnarray} $\cos^2\theta+\sin^2\theta=1$ ですから \begin{eqnarray} \sin^2\theta &=& 1-\cos^2\theta \\ &=& 1-\frac{\{(\boldsymbol{a},\boldsymbol{b})\}^2}{\|\boldsymbol{a}\|^2 \|\boldsymbol{b}\|^2} \label{sin2} \end{eqnarray} 式(\ref{cos2})と式(\ref{sin2})から \begin{eqnarray} \tan^2\theta &=& \frac{\sin^2\theta}{\cos^2\theta} \\ &=& \frac{1-\frac{\{(\boldsymbol{a},\boldsymbol{b})\}^2}{\|\boldsymbol{a}\|^2 \|\boldsymbol{b}\|^2}}{\frac{\{(\boldsymbol{a},\boldsymbol{b})\}^2}{\|\boldsymbol{a}\|^2 \|\boldsymbol{b}\|^2}} \\ && 両辺を \|\boldsymbol{a}\|^2 \|\boldsymbol{b}\|^2 倍すると \nonumber\\ &=& \frac{\|\boldsymbol{a}\|^2 \|\boldsymbol{b}\|^2 - \{(\boldsymbol{a},\boldsymbol{b})\}^2}{\{(\boldsymbol{a},\boldsymbol{b})\}^2} \label{tan2} \end{eqnarray} 式(\ref{tan2})の分子を要素で書くと \begin{eqnarray} \require{cancel} (a_x^2+a_y^2)(b_x^2+b_y^2)-(a_x b_x + a_y b_y)^2 &=& \cancel{a_x^2 b_x^2} + a_y^2 b_x^2 + a_x^2 b_y^2 + \bcancel{a_y^2 b_y^2} - \cancel{a_x^2 b_x^2} - 2 a_x a_y b_x b_y - \bcancel{a_y^2 b_y^2} \\ &=& a_y^2 b_x^2 - 2 a_x b_x a_y b_y + a_x^2 b_y^2 \\ &=& (a_y b_x - a_x b_y)^2 \end{eqnarray} と簡単化できますので、式(\ref{tan2})は \begin{eqnarray} \tan^2\theta &=& \frac{(a_y b_x - a_x b_y)^2}{(a_x b_x+a_y b_y)^2} \end{eqnarray} 両辺の平方根は \begin{eqnarray} \tan\theta &=& \frac{a_y b_x - a_x b_y}{a_x b_x+a_y b_y} \end{eqnarray} よって \begin{eqnarray} \theta &=& \tan^{-1}\frac{a_y b_x - a_x b_y}{a_x b_x+a_y b_y} \end{eqnarray} と計算すれば平方根を使わず、乗算も 4 回で済みます。