# クラス fk_Quaternion

四元数(クォータニオン)を管理するクラス [詳細]

fk_Quaternionのコラボレーション図
[凡例]

すべてのメンバ一覧

## Public メソッド
| fk_Quaternion (void)
| コンストラクタ1
| fk_Quaternion (double s, double x, double y, double z)
| コンストラクタ2
| fk_Quaternion (const double s, const fk_Vector &v)
| コンストラクタ3
| fk_Quaternion (const fk_Quaternion &)
| コピーコンストラクタ
単項演算子
fk_Quaternion & | operator- (void) const
| 単項マイナス演算子
fk_Quaternion & | operator~ (void) const
| 単項共役演算子
fk_Quaternion & | operator! (void) const
| 単項逆元演算子
比較演算子
bool | operator== (const fk_Quaternion &) const
| 同値比較演算子
bool | operator!= (const fk_Quaternion &) const
| 異値比較演算子
代入演算子
fk_Quaternion & | operator= (const fk_Quaternion &)
| 単純代入演算子
fk_Quaternion & | operator*= (const fk_Quaternion &)
| 積代入演算
fk_Quaternion & | operator*= (double)
| スカラー倍代入演算子
fk_Quaternion & | operator/= (double)
| スカラー商代入演算子
fk_Quaternion & | operator+= (const fk_Quaternion &)
| 単項和代入演算子
fk_Quaternion & | operator-= (const fk_Quaternion &)
| 単項差代入演算子
メンバ関数
void | init (void)
| 初期化関数
void | set (double s, double x, double y, double z)
| 成分設定関数1
void | set (double s, const fk_Vector &v)
| 成分設定関数2
void | setRotate (double theta, double x, double y, double z)
| 回転変換設定関数1
void | setRotate (double theta, const fk_Vector &V)
| 回転変換設定関数2
void | makeEuler (double h, double p, double b)
| オイラー角変換設定関数1
void | makeEuler (const fk_Angle &angle)
| オイラー角変換設定関数1
fk_Angle & | getEuler (void) const
| オイラー角取得関数
double | norm (void) const
| ノルム取得関数
double | abs (void) const
| 絶対値取得関数
bool | normalize (void)
| 正規化関数
void | conj (void)
| 共役化関数
bool | inverse (void)
| 逆元化関数
fk_Matrix & | conv (void) const
| 行列変換関数
## Public 変数
double | s
| スカラー部
fk_Vector | v
| ベクトル部
## フレンド
二項演算子
fk_Quaternion | operator* (const fk_Quaternion &, const fk_Quaternion &)
fk_Quaternion | operator+ (const fk_Quaternion &, const fk_Quaternion &)
fk_Quaternion | operator- (const fk_Quaternion &, const fk_Quaternion &)
fk_Quaternion | operator* (const fk_Quaternion &, double)
fk_Quaternion | operator* (double, const fk_Quaternion &)
fk_Quaternion | operator/ (const fk_Quaternion &, double)
fk_Vector | operator* (const fk_Quaternion &, const fk_Vector &)
double | operator^ (const fk_Quaternion &, const fk_Quaternion &)

## 説明

四元数(クォータニオン)を管理するクラス

このクラスは、四元数(クォータニオン)の様々な機能を提供します。 四元数とは、3種類の虚数単位 と 4 個の実数 を用いて

という形式で表現される数のことで、「ハミルトン数」とも呼ばれます。 3Dグラフィックス分野での主な利用用途は、3次元の姿勢補間です。 四元数の補間については fk_Math を参照して下さい。

上記定義式のうち、s を「スカラー部」、(x, y, z) を「ベクトル部」と呼びます。 fk_Quaternion クラスでは、スカラー部を double 型の「s」というメンバ、 ベクトル部を fk_Vector 型の「v」というメンバで保持します。 従って、変数名を q としたときの各成分は q.s, q.v.x, q.v.y, q.v.z となります。これらは、全て public メンバとなっているため、 直接代入や参照を行うことが可能です。

四元数は、数学的には任意軸回転変換を表現します。 一つの四元数 は3次元ベクトル に対し、

という演算によって回転変換したベクトル を求めることができます。 また、四元数の積演算が合成変換を意味します。

その他の数学的性質については、各演算子やメンバ関数の項目で解説します。

参照:
  fk_Vector, fk_Angle, fk_Matrix, fk_Math

## コンストラクタとデストラクタ

fk_Quaternion::fk_Quaternion | ( | void |  | ) |

コンストラクタ1

引数なしの場合、全ての成分が 0 である四元数を生成します。 特に、スカラー部も 0 であることに注意して下さい。

fk_Quaternion::fk_Quaternion | ( | double | s,
|  | double | x,
|  | double | y,
|  | double | z |
| ) |  |  |

コンストラクタ2

4個の実数を引数とするコンストラクタによって、 各成分を個別に初期設定できます。

四元数の成分は、回転角や回転軸を直接表すものではありません。 回転角と回転軸を設定したい場合は、 setRotate() を使用して下さい。

引数:

  `[in]` | s | スカラー部設定値
  `[in]` | x | ベクトル部 x 成分設定値
  `[in]` | y | ベクトル部 y 成分設定値
  `[in]` | z | ベクトル部 z 成分設定値

参照:
  set(), setRotate()

fk_Quaternion::fk_Quaternion | ( | const double | s,
|  | const fk_Vector & | v |
| ) |  |  |

コンストラクタ3

1個の実数と1個の fk_Vector 型変数を引数とするコンストラクタによって、 スカラー部とベクトル部をそれぞれ初期設定できます。

四元数の成分は、回転角や回転軸を直接表すものではありません。 回転角と回転軸を設定したい場合は、 setRotate() を使用して下さい。

引数:

  `[in]` | s | スカラー部設定値
  `[in]` | v | ベクトル部設定値

参照:
  set(), setRotate()

fk_Quaternion::fk_Quaternion | ( | const fk_Quaternion & |  | ) |

コピーコンストラクタ

## 関数

fk_Quaternion& fk_Quaternion::operator- | ( | void |  | ) | const

単項マイナス演算子

四元数 に対し、

として符号は定義されます。以下のコードは、q2 に -q1 を代入します。

        q2 = -q1;

fk_Quaternion& fk_Quaternion::operator~ | ( | void |  | ) | const

単項共役演算子

四元数 に対し、

として共役 は定義されます。 以下のコードは、q2 に q1 の共役を代入します。

        q2 = ~q1;

参照:
  conj()

fk_Quaternion& fk_Quaternion::operator! | ( | void |  | ) | const

単項逆元演算子

四元数 に対し、

として逆元 は定義されます。

四元数が正規である(つまり、ノルムが1である)場合、 四元数の逆元と共役は等しくなります。 また、四元数によるベクトル変換を考えたとき、逆元は逆変換を表します。

以下のコードは、変数 q1 の逆元を q2 に代入します。

        q2 = !q1;

参照:
  norm(), inverse()

bool fk_Quaternion::operator== | ( | const fk_Quaternion & |  | ) | const

同値比較演算子

fk_Quaternion では、以下のように記述することで、 q1 と q2 が等しいかどうかを判断できます。

        if(q1 == q2) {
            :
            :
        }

ここでの比較は、ある程度の計算誤差を許容します。

bool fk_Quaternion::operator!= | ( | const fk_Quaternion & |  | ) | const

異値比較演算子

fk_Quaternion では、以下のように記述することで、 q1 と q2 が等しくないかどうかを判断できます。

        if(q1 != q2) {
            :
            :
        }

ここでの比較は、ある程度の計算誤差を許容します。

fk_Quaternion& fk_Quaternion::operator= | ( | const fk_Quaternion & |  | ) |

単純代入演算子

fk_Quaternion& fk_Quaternion::operator*= | ( | const fk_Quaternion & |  | ) |

積代入演算

以下のコードは、四元数 q1 および q2 の積を 前の q1 の値は破棄して改めて q1 に設定します。

        q1 *= q2;

これは、以下のコードと同義です。

        q1 = q1 * q2;

覚え書き:
  四元数の積は交換法則が成り立たないため、 を に代入したいときは、この演算子は利用できません。

fk_Quaternion& fk_Quaternion::operator*= | ( | double |  | ) |

スカラー倍代入演算子

以下のコードは、四元数 q の全ての成分を d 倍します。 q は fk_Quaternion 型の変数、d は double 型の変数です。

        q *= d;

d は変数でなく数値でも構いません。

        q *= 2.0;

fk_Quaternion& fk_Quaternion::operator/= | ( | double |  | ) |

スカラー商代入演算子

以下のコードは、四元数 q の全ての成分を 1/d 倍します。 q は fk_Quaternion 型の変数、d は double 型の変数です。

        q /= d;

d は変数でなく数値でも構いません。

        q /= 2.0;

fk_Quaternion& fk_Quaternion::operator+= | ( | const fk_Quaternion & |  | ) |

単項和代入演算子

以下のコードは、q1 に q2 分を加算します。 q1, q2 はいずれも fk_Quaternion 型の変数です。

        q1 += q2;

上記コードは、以下のコードと同義です。

        q1 = q1 + q2;

fk_Quaternion& fk_Quaternion::operator-= | ( | const fk_Quaternion & |  | ) |

単項差代入演算子

以下のコードは、q1 に q2 分を減算します。 q1, q2 はいずれも fk_Quaternion 型の変数です。

        q1 -= q2;

上記コードは、以下のコードと同義です。

        q1 = q1 - q2;

void fk_Quaternion::init | ( | void |  | ) |

初期化関数

スカラー部を 1 に、ベクトル部を零ベクトルとして初期化します。

void fk_Quaternion::set | ( | double | s,
|  | double | x,
|  | double | y,
|  | double | z |
| ) |  |  |

成分設定関数1

各成分を個別に設定します。

ここで与えられるスカラー部とベクトル部は、 回転角や回転軸を表すわけではないことに注意して下さい。 回転変換における回転角と回転軸を設定する場合は、 setRotate() を用います。

引数:

  `[in]` | s | スカラー部設定値
  `[in]` | x | ベクトル部 x 成分設定値
  `[in]` | y | ベクトル部 y 成分設定値
  `[in]` | z | ベクトル部 z 成分設定値

参照:
  setRotate()

void fk_Quaternion::set | ( | double | s,
|  | const fk_Vector & | v |
| ) |  |  |

成分設定関数2

1個の実数と1個の fk_Vector 型変数から、 スカラー部とベクトル部をそれぞれ設定します。

ここで与えられるスカラー部とベクトル部は、 回転角や回転軸を表すわけではないことに注意して下さい。 回転変換における回転角と回転軸を設定する場合は、 setRotate() を用います。

引数:

  `[in]` | s | スカラー部設定値
  `[in]` | v | ベクトル部設定値

参照:
  setRotate()

void fk_Quaternion::setRotate | ( | double | theta,
|  | double | x,
|  | double | y,
|  | double | z |
| ) |  |  |

回転変換設定関数1

回転角を theta、回転軸を (x, y, z) とする回転変換を表す四元数を設定します。 回転軸は正規化されている必要はありません。

具体的に設定される成分値は、回転角を とし、 回転軸を表すベクトルを としたとき、 スカラー部は が、 ベクトル部は が設定されます。

ここで与えられた値と、設定される成分値は異なることに注意してください。 成分値を直接代入するには set() を用います。

引数:

  `[in]` | theta | 回転角
  `[in]` | x | 回転軸の x 成分
  `[in]` | y | 回転軸の y 成分
  `[in]` | z | 回転軸の z 成分

参照:
  set()

void fk_Quaternion::setRotate | ( | double | theta,
|  | const fk_Vector & | V |
| ) |  |  |

回転変換設定関数2

回転角を theta、回転軸を V とする回転変換を表す四元数を設定します。 回転軸は正規化されている必要はありません。

具体的に設定される成分値は、回転角を とし、 回転軸を表すベクトルを としたとき、 スカラー部は が、 ベクトル部は が設定されます。

ここで与えられた値と、設定される成分値は異なることに注意してください。 成分値を直接代入するには set() を用います。

引数:

  `[in]` | theta | 回転角
  `[in]` | V | 回転軸ベクトル

参照:
  set()

void fk_Quaternion::makeEuler | ( | double | h,
|  | double | p,
|  | double | b |
| ) |  |  |

オイラー角変換設定関数1

原点を中心とする物体が、 オイラー角 (0, 0, 0) から (h, p, b) の状態に回転する変換を表す四元数を設定します。 オイラー角についての解説は、 fk_Angle を参照して下さい。

引数:

  `[in]` | h | ヘディング角
  `[in]` | p | ピッチ角
  `[in]` | b | バンク角

void fk_Quaternion::makeEuler | ( | const fk_Angle & | angle | ) |

オイラー角変換設定関数1

原点を中心とする物体が、 オイラー角 (0, 0, 0) から angle が表すオイラー角の状態に回転する変換を表す四元数を設定します。 オイラー角についての解説は、 fk_Angle を参照して下さい。

引数:

  `[in]` | angle | オイラー角

fk_Angle& fk_Quaternion::getEuler | ( | void |  | ) | const

オイラー角取得関数

四元数を回転変換として解釈したときに、 オイラー角 (0, 0, 0) の状態の物体が回転したときの 姿勢状態を示すオイラー角を返します。 オイラー角についての解説は、 fk_Angle を参照して下さい。

戻り値:
  オイラー角

double fk_Quaternion::norm | ( | void |  | ) | const

ノルム取得関数

四元数 のノルム値 を返します。 のノルム値は、 以下のように定義されます。

戻り値:
  ノルム値

double fk_Quaternion::abs | ( | void |  | ) | const

絶対値取得関数

四元数 の絶対値 を返します。 の絶対値は、 以下のように定義されます。

戻り値:
  絶対値

bool fk_Quaternion::normalize | ( | void |  | ) |

正規化関数

四元数を正規化します。正規化とは、元の四元数の成分を絶対値で割ることで、 絶対値が 1 である四元数を求めることです。 全ての成分が 0 である場合のみ、正規化できません。

戻り値:
  成功すれば true を、失敗すれば false を返します。

void fk_Quaternion::conj | ( | void |  | ) |

共役化関数

現在設定されている四元数に対し、自身を共役化します。

四元数 に対し、

として共役 は定義されます。

bool fk_Quaternion::inverse | ( | void |  | ) |

逆元化関数

現在設定されている四元数に対し、自身を逆元化します。

四元数 に対し、

として逆元 は定義されます。

四元数が正規である(つまり、ノルムが1である)場合、 四元数の逆元と共役は等しくなります。 また、四元数によるベクトル変換を考えたとき、逆元は逆変換を表します。

戻り値:
  成功すれば true を返し、失敗すれば false を返します。 失敗は、全ての成分が 0 である場合に起こります。

参照:
  norm(), conj()

fk_Matrix& fk_Quaternion::conv | ( | void |  | ) | const

行列変換関数

四元数を回転変換と考えたときの、同じ回転変換を意味する行列を返します。

戻り値:
  回転変換行列

## フレンドと関連する関数

fk_Quaternion operator* | ( | const fk_Quaternion & | ,
|  | const fk_Quaternion & |  |
| ) |  |  | `[friend]`

fk_Quaternion operator+ | ( | const fk_Quaternion & | ,
|  | const fk_Quaternion & |  |
| ) |  |  | `[friend]`

fk_Quaternion operator- | ( | const fk_Quaternion & | ,
|  | const fk_Quaternion & |  |
| ) |  |  | `[friend]`

fk_Quaternion operator* | ( | const fk_Quaternion & | ,
|  | double |  |
| ) |  |  | `[friend]`

fk_Quaternion operator* | ( | double | ,
|  | const fk_Quaternion & |  |
| ) |  |  | `[friend]`

fk_Quaternion operator/ | ( | const fk_Quaternion & | ,
|  | double |  |
| ) |  |  | `[friend]`

fk_Vector operator* | ( | const fk_Quaternion & | ,
|  | const fk_Vector & |  |
| ) |  |  | `[friend]`

double operator^ | ( | const fk_Quaternion & | ,
|  | const fk_Quaternion & |  |
| ) |  |  | `[friend]`

## 変数

double fk_Quaternion::s

スカラー部

fk_Vector fk_Quaternion::v

ベクトル部