夏が来れば思い出す、Euler角、四元数(2): Scalaで実装してみた。

By | 2018年7月16日 , Last update: 2022年8月7日

はじめに

ちょっと前に書いた記事で四元数の乗算を用いて三次元空間における回転変換を表現できることを示しました。

この記事ではそれを受ける形で、四元数の演算を行うScalaのオブジェクト及びコンパニオンクラスを実装していきます。

スポンサーリンク

実装の方針。

実装のやり方についてもかなり前の記事で書いた複素数のオブジェクト及びコンパニオンクラスに準ずることにします。

実装例。

実装例は以下のような感じになります。割と長いです。

考慮が必要と思われる点(その1): 除算

四元数$q$を除数とする除算$div(p,q), p, q \in \mathbb{H}$は、逆数を右からかける演算として以下の式で定義します。

\begin{eqnarray}
div(p,q) &=& p\cdot q^{-1}
\end{eqnarray}

なお、四元数の集合$\mathbb{H}$の任意の2元の間には乗法に関する交換則が成立しないため、逆数を左から$q^{-1}\cdot p$のようにかける演算も除算と考えることができそうですが、上記のコードではこれに対応する実装を行っていません。

考慮が必要と思われる点(その2): 剰余

四元数の剰余というものが定義できるかどうかわかりませんが、複素数の場合と同様に以下の手順で計算し、その結果得られた数を剰余とするコードを実装しています。

  1. 剰余演算子の左辺の四元数($p \in \mathbb{H}$と置きます。)を被除数、剰余演算子の右辺の四元数($q \in \mathbb{H}$と置きます。)を除数とする除算を実行し、その商を得ます。以下、商の値を$d \in \mathbb{H}$と置きます。
  2. $d$の実部及び虚部($i,j,k$)成分をそれぞれ四捨五入した値を求め、これを$d^{\prime}$とします。
  3. 以下の式により計算される値$m$を剰余とします。除算を$p\cdot q^{-1}$と定義しているため、$d^{\prime}$に対して$q$を左からかけています。
    \begin{eqnarray}
    m &=& p-d^{\prime}\cdot q
    \end{eqnarray}

考慮が必要と思われる点(その3): 四元数のべき乗

$p, q \in \mathbb{H}$としたときに四元数のべき乗を以下の式で計算しています。

\begin{eqnarray}
q^p &=& \exp(\ln(q)\cdot p)
\end{eqnarray}

テスト。

とりあえず、Eclipseで実行できるようにmainメソッド入りのテスト用オブジェクト(QuaternionTestオブジェクト)を書いてみました。以下のような感じになります。

テスト結果は長くなりますので掲載しないことにしますが、結果を確認した感じでは問題なさそうな感じに見えます。

まとめ

ここまで、Scalaで四元数を扱うためのオブジェクト及びクラスの実装について書きました。

前項で示したテスト用のプログラムもScalaTestで使用できるように書くべきところかもしれませんが、今回はここで力尽きてしまったので、別の機会に書きたいと考えています。

(´・ω・`)

この記事は以上です。

参考文献