機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

回転軸と回転角から2つの鏡映変換を求める

はじめに

鏡映変換を2回行うことで回転変換は実現できるという記事で2つの鏡映変換から回転を生み出したわけですが、
この逆はできるんかとちょっと気になったので考えてみました。
(本記事は参考リンクの続編的な記事です。)

導出(※一意には定まらないことに注意してください)

回転軸 {\bf w}=(w_x,w_y,w_z)^\top\in{\mathbb R}^3、回転角 \theta\in{\mathbb R} から
2つの鏡映変換を表す、原点を通る平面の法線ベクトル {\bf n}=(n_x,n_y,n_z)^\top,{\bf u}=(u_x,u_y,u_z)^\top\in{\mathbb R}^3 を求めるというのが今回やりたいことです。
\{{\bf w}\|=\{{\bf n}\|=\{{\bf u}\|=1 です。

幾何的に考えてみます。
先に {\bf n} を求めてみます。
{\bf n},{\bf u}{\bf w} を法線とする原点を通る平面上のベクトルです。(なので、{\bf n},{\bf u} は一意には定まりません。)
最終的にはプログラムに落とし込むことも考えてアルゴリズムを書きます。
|w_x|>|w_y|,|w_x|>|w_z| の時、{\bf n}^\top{\bf w}=0 より、以下が成り立ちます。

\begin{eqnarray}
n_xw_x+n_yw_y+n_zw_z = 0\tag{1}
\end{eqnarray}

(1)n_x について解きます。

\begin{eqnarray}
n_x = \dfrac{-n_yw_y-n_zw_z}{w_x}\tag{2}
\end{eqnarray}

n_y,n_z に適当な値を代入します。 n_y=1,n_z=1 とすると、n_x は以下のようになります。

\begin{eqnarray}
n_x = \dfrac{-w_y-w_z}{w_x}\tag{3}
\end{eqnarray}

n_x,n_y,n_z が定まりましたが、正規化されていないので、正規化します。
これで {\bf n} が求まりました。|w_x|>|w_y|,|w_x|>|w_z| 以外の場合は、上記の方法を参考に対応してください。

次に {\bf u} を求めます。
{\bf n},{\bf u} を法線とする平面のなす角は \dfrac{\theta}{2} です。
また、以下が成り立ちます。

\begin{eqnarray}
\left\{
\begin{array}{l}
{\bf w}=\dfrac{{\bf n}\times{\bf u}}{\|{\bf n}\times{\bf u}\|}\\
\|{\bf n}\times{\bf u}\|=\sin\dfrac{\theta}{2}
\end{array}
\right.\tag{4}
\end{eqnarray}

s=\sin\dfrac{\theta}{2} とおいて、式 (4) をまとめると、以下のようになります。

\begin{eqnarray}
{\bf n}\times{\bf u}=s{\bf w}\tag{5}
\end{eqnarray}

また、以下も成り立ちます。c=\cos\dfrac{\theta}{2} とおきます。

\begin{eqnarray}
{\bf n}^\top{\bf u}=c\tag{6}
\end{eqnarray}

(5),(6) で式が4つであり、求める変数 \bf u は3つであるので求まります。
(多分理論だけで終わらせるので、こんな書き方にしてしまいました。
(5) から式を2つ採用し、それと式 (6) を合わせて、連立方程式逆行列を使って解けば求まると思います。)
{\bf u} が求まったら、正規化します。

以上より、{\bf R},\theta より、{\bf n},{\bf u} が求まりました。

最後に

これプログラムで確認したほうがいいよなー。
確認したら、また書き込みます。
間違っていたら、連絡ください。

目次へ戻る