FineKernelToolKit: FK::fk_OrthoMatrix クラス

FineKernelToolKit 4.3.0

読み取り中…
検索中…
一致する文字列を見つけられません
公開メンバ関数 | 全メンバ一覧
FK::fk_OrthoMatrix クラス

4元正方直交行列を管理するクラス [詳解]

`#include <FK/Matrix.h>`

FK::fk_OrthoMatrix の継承関係図
[凡例]

## 公開メンバ関数

| fk_OrthoMatrix (void)
| コンストラクタ
| fk_OrthoMatrix (const fk_OrthoMatrix &)
| コピーコンストラクタ
| ~fk_OrthoMatrix ()
| デストラクタ
単項演算子
fk_OrthoMatrix | operator! (void) const
| 逆行列取得演算子
double * | operator[] (int)
| 成分参照演算子
比較演算子
bool | operator== (const fk_OrthoMatrix &) const
| 同値比較演算子
bool | operator!= (const fk_OrthoMatrix &) const
| 異値比較演算子
代入演算子
fk_OrthoMatrix & | operator= (const fk_OrthoMatrix &)
| 単純代入演算子
fk_OrthoMatrix & | operator*= (const fk_OrthoMatrix &)
| 行列積代入演算子
メンバ関数
void | init (void)
void | set (int row, int col, double value)
| 成分設定関数
void | setRow (int row, const fk_Vector &V)
| 行ベクトル成分設定関数1
void | setRow (int row, const fk_HVector &V)
| 行ベクトル成分設定関数2
void | setCol (int col, const fk_Vector &V)
| 列ベクトル成分設定関数1
void | setCol (int col, const fk_HVector &V)
| 列ベクトル成分設定関数2
fk_HVector | getRow (int row)
| 行ベクトル成分取得関数
fk_HVector | getCol (int col)
| 列ベクトル成分取得関数
bool | inverse (void)
| 逆行列化関数
void | negate (void)
| 転置化関数
void | makeRot (double rad, fk_Axis axis)
| 座標軸回転行列生成関数
void | makeTrans (double x, double y, double z)
| 平行移動行列生成関数1
void | makeTrans (const fk_Vector &V)
| 平行移動行列生成関数2
void | makeEuler (double h, double p, double b)
| オイラー角回転行列生成関数1
void | makeEuler (const fk_Angle &angle)
| オイラー角回転行列生成関数2

## 詳解

4元正方直交行列を管理するクラス

このクラスは、4元正方直交行列に関する様々な機能を提供します。 直交行列とは、逆行列が存在し(正則)、逆行列と転置行列が等しい行列のことです。 M を直交行列として数式で記述すると以下のようになります。

\[ \mathbf{M}^{-1} = \mathbf{M}^{\top} \]

代数的な定義は上記のとおりですが、直交行列を一次変換の見地で述べると、 回転変換、平行移動変換、すべての軸方向の拡大率が等しい拡大縮小変換の 合成変換を満たすことになります。 この変換の特徴は、変換した際に常に角度が保存されるという点です。

直交行列は、 その性質上表現できる行列に制限がありますが、 逆行列を求める方法が転置するだけでよいということから、 一般的な行列よりも高速に逆行列を求められるという長所があります。 FK では、直交行列を一般行列から区別して扱うことで、 座標変換処理の高速化を実現しています。

数学的には、全ての軸方向に対して等しい倍率の拡大縮小を行う変換行列も 直交行列と言えますが、このクラスにおいては拡大縮小行列を想定していません。 そのような行列が設定された場合は、挙動に不具合を生じる可能性があります。

一般的な4元正方行列を扱う場合は fk_Matrix を利用して下さい。 さらに任意元の正方行列を扱う場合は fk_GenMatrix を利用して下さい。

参照
  fk_Matrix, fk_GenMatrix, fk_Vector, fk_HVector, fk_Angle

## 構築子と解体子

## ◆ fk_OrthoMatrix() [1/2]

FK::fk_OrthoMatrix::fk_OrthoMatrix | ( | void |  | ) |

コンストラクタ

単位行列を生成します。

## ◆ fk_OrthoMatrix() [2/2]

FK::fk_OrthoMatrix::fk_OrthoMatrix | ( | const fk_OrthoMatrix & |  | ) |

コピーコンストラクタ

## ◆ ~fk_OrthoMatrix()

FK::fk_OrthoMatrix::~fk_OrthoMatrix | ( |  | ) |

デストラクタ

## 関数詳解

## ◆ operator!()

fk_OrthoMatrix FK::fk_OrthoMatrix::operator! | ( | void |  | ) | const

逆行列取得演算子

以下のコードは、M_org の逆行列を M_new に代入します。

    M_new = !M_org;

このとき、M_org は変化しません。

## ◆ operator[]()

double * FK::fk_OrthoMatrix::operator[] | ( | int |  | ) |

成分参照演算子

行列中の各成分を直接参照する場合や、 直接代入する場合は配列演算子を用います。 以下のコードは、行列 \(\mathbf{M}\) における成分 \( M_{12} \) に 1 を代入するものです。

    M[1][2] = 1.0;

行列の成分は、配列演算子のうち左側が行番号、右側が列番号を指します。 配列は以下の通りです。

\[ \left( \begin{array}{cccc} \left[0\right]\left[0\right] & \left[0\right]\left[1\right] & \left[0\right]\left[2\right] & \left[0\right]\left[3\right] \\ \left[1\right]\left[0\right] & \left[1\right]\left[1\right] & \left[1\right]\left[2\right] & \left[1\right]\left[3\right] \\ \left[2\right]\left[0\right] & \left[2\right]\left[1\right] & \left[2\right]\left[2\right] & \left[2\right]\left[3\right] \\ \left[3\right]\left[0\right] & \left[3\right]\left[1\right] & \left[3\right]\left[2\right] & \left[3\right]\left[3\right] \\ \end{array} \right) \]

覚え書き
  厳密には、行全体が double 型の配列として存在しており、 例えば M[1] というのは上から 2 行目の配列ポインタを指します。 また、16個の成分要素全体がメモリとして全て整列していることは保証されています。

警告
  (この警告は、 fk_Matrix 型のインスタンスで利用する場合には関係ありません。) fk_OrthoMatrix 型の変数では注意が必要です。 この機能を用いて成分を直接書き換えた場合、 数学的には行列が直交行列の条件を満たさなくなる設定も可能となります。 その場合の挙動は保証できません。 直交行列であることが保証できない操作を行う場合は、 fk_OrthoMatrix ではなく fk_Matrix を用いてください。

## ◆ operator==()

bool FK::fk_OrthoMatrix::operator== | ( | const fk_OrthoMatrix & |  | ) | const

同値比較演算子

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

    if(M1 == M2) {
        :
        :
    }

ここでの比較は、各成分の比較において fk_Vector::MATRIXEPS までの数値誤差を許容しています。

## ◆ operator!=()

bool FK::fk_OrthoMatrix::operator!= | ( | const fk_OrthoMatrix & |  | ) | const

異値比較演算子

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

    if(M1 != M2) {
        :
        :
    }

ここでの比較は、各成分の比較において fk_Vector::MATRIXEPS までの数値誤差を許容しています。

## ◆ operator=()

fk_OrthoMatrix & FK::fk_OrthoMatrix::operator= | ( | const fk_OrthoMatrix & |  | ) |

単純代入演算子

## ◆ operator*=()

fk_OrthoMatrix & FK::fk_OrthoMatrix::operator*= | ( | const fk_OrthoMatrix & |  | ) |

行列積代入演算子

以下のコードは、M1 と M2 の行列積を 前の M1 の値は破棄して改めて M1 に設定します。

    M1 *= M2;

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

    M1 = M1 * M2;

覚え書き
  行列積は交換法則が成り立たないため、 \( \mathbf{M}_2\mathbf{M}_1 \) を \( \mathbf{M}_1 \) に代入したいときには、この演算子は利用できません。

## ◆ init()

void FK::fk_OrthoMatrix::init | ( | void |  | ) |

単位行列化関数

行列を単位行列に初期化します。

## ◆ set()

void FK::fk_OrthoMatrix::set | ( | int | row,
|  | int | col,
|  | double | value )

成分設定関数

行番号 row、列番号 col に対応する成分を value に設定します。 row, col はそれぞれ最初が 0、最後が 3 になります。

引数

  [in] | row | 行番号
  [in] | col | 列番号
  [in] | value | 設定する成分の値

警告
  (この警告は、 fk_Matrix 型のインスタンスで利用する場合には関係ありません。) fk_OrthoMatrix 型の変数では注意が必要です。 この機能を用いて成分を直接書き換えた場合、 数学的には行列が直交行列の条件を満たさなくなる設定も可能となります。 その場合の挙動は保証できません。 直交行列であることが保証できない操作を行う場合は、 fk_OrthoMatrix ではなく fk_Matrix を用いてください。

## ◆ setRow() [1/2]

void FK::fk_OrthoMatrix::setRow | ( | int | row,
|  | const fk_Vector & | V )

行ベクトル成分設定関数1

行列中の、行番号が row である行ベクトルを設定します。 row は最初が 0、最後が 3 となります。この関数の場合、 行ベクトルの最後の成分については値は変更しません。

次のコード

    M.setRow(row, vec);

は、以下のコードと同義になります。

    M[row][0] = vec.x;
    M[row][1] = vec.y;
    M[row][2] = vec.z;

引数

  [in] | row | 行番号
  [in] | V | 行ベクトル

## ◆ setRow() [2/2]

void FK::fk_OrthoMatrix::setRow | ( | int | row,
|  | const fk_HVector & | V )

行ベクトル成分設定関数2

行列中の、行番号が row である行ベクトルを設定します。 row は最初が 0、最後が 3 となります。

次のコード

    M.setRow(row, vec);

は、以下のコードと同義になります。

    M[row][0] = vec.x;
    M[row][1] = vec.y;
    M[row][2] = vec.z;
    M[row][3] = vec.w;

引数

  [in] | row | 行番号
  [in] | V | 行ベクトル

## ◆ setCol() [1/2]

void FK::fk_OrthoMatrix::setCol | ( | int | col,
|  | const fk_Vector & | V )

列ベクトル成分設定関数1

行列中の、列番号が col である列ベクトルを設定します。 col は最初が 0、最後が 3 となります。この関数の場合、 列ベクトルの最後の成分については値は変更しません。

次のコード

    M.setCol(col, vec);

は、以下のコードと同義になります。

    M[0][col] = vec.x;
    M[1][col] = vec.y;
    M[2][col] = vec.z;

引数

  [in] | col | 行番号
  [in] | V | 行ベクトル

## ◆ setCol() [2/2]

void FK::fk_OrthoMatrix::setCol | ( | int | col,
|  | const fk_HVector & | V )

列ベクトル成分設定関数2

行列中の、列番号が col である列ベクトルを設定します。 col は最初が 0、最後が 3 となります。

次のコード

    M.setCol(col, vec);

は、以下のコードと同義になります。

    M[0][col] = vec.x;
    M[1][col] = vec.y;
    M[2][col] = vec.z;
    M[3][col] = vec.w;

引数

  [in] | col | 行番号
  [in] | V | 行ベクトル

## ◆ getRow()

fk_HVector FK::fk_OrthoMatrix::getRow | ( | int | row | ) |

行ベクトル成分取得関数

行列中の、行番号が row である行ベクトルを返します。 row は最初が 0、最後が 3 となります。

引数

  [in] | row | 行番号

戻り値
  行ベクトル

## ◆ getCol()

fk_HVector FK::fk_OrthoMatrix::getCol | ( | int | col | ) |

列ベクトル成分取得関数

行列中の、列番号が col である列ベクトルを返します。 col は最初が 0、最後が 3 となります。

引数

  [in] | col | 列番号

戻り値
  列ベクトル

## ◆ inverse()

bool FK::fk_OrthoMatrix::inverse | ( | void |  | ) |

逆行列化関数

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

戻り値
  成功すれば true を、失敗すれば false を返します。 通常、直交行列であれば結果は必ず成功となります。

覚え書き
  直交行列の場合、この関数は negate() でもまったく同様に動作します。

## ◆ negate()

void FK::fk_OrthoMatrix::negate | ( | void |  | ) |

転置化関数

現在設定されている行列に対し、自身を転置化します。

覚え書き
  直交行列の場合、この関数は inverse() でもまったく同様に動作します。

## ◆ makeRot()

void FK::fk_OrthoMatrix::makeRot | ( | double | rad,
|  | fk_Axis | axis )

座標軸回転行列生成関数

座標軸回転変換を表す行列を生成します。

引数

  [in] | rad | 回転角。単位は弧度法(ラジアン)です。
  [in] | axis | 座標軸。

## ◆ makeTrans() [1/2]

void FK::fk_OrthoMatrix::makeTrans | ( | double | x,
|  | double | y,
|  | double | z )

平行移動行列生成関数1

平行移動変換を表す行列を生成します。

引数

  [in] | x | 移動ベクトルの x 成分
  [in] | y | 移動ベクトルの y 成分
  [in] | z | 移動ベクトルの z 成分

## ◆ makeTrans() [2/2]

void FK::fk_OrthoMatrix::makeTrans | ( | const fk_Vector & | V | ) |

平行移動行列生成関数2

平行移動変換を表す行列を生成します。

引数

  [in] | V | 移動ベクトル

## ◆ makeEuler() [1/2]

void FK::fk_OrthoMatrix::makeEuler | ( | double | h,
|  | double | p,
|  | double | b )

オイラー角回転行列生成関数1

オイラー角による合成回転変換を表す行列を生成します。 オイラー角については、 fk_Angle を参照して下さい。

引数

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

## ◆ makeEuler() [2/2]

void FK::fk_OrthoMatrix::makeEuler | ( | const fk_Angle & | angle | ) |

オイラー角回転行列生成関数2

オイラー角による合成回転変換を表す行列を生成します。 オイラー角については、 fk_Angle を参照して下さい。

引数

  [in] | angle | オイラー角