# クラス fk_OrthoMatrix

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

fk_OrthoMatrixに対する継承グラフ
[凡例]

すべてのメンバ一覧

## Public メソッド
| fk_OrthoMatrix (void)
| コンストラクタ
| fk_OrthoMatrix (const 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)
| 成分設定関数
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)
| オイラー角回転行列生成関数1
## フレンド
二項演算子
fk_HVector | operator* (const fk_OrthoMatrix &, const fk_HVector &)
fk_OrthoMatrix | operator* (const fk_OrthoMatrix &, const fk_OrthoMatrix &)
fk_Matrix | operator* (const fk_Matrix &, const fk_OrthoMatrix &)
fk_Matrix | operator* (const fk_OrthoMatrix &, const fk_Matrix &)
fk_Matrix | operator+ (const fk_Matrix &, const fk_OrthoMatrix &)
fk_Matrix | operator+ (const fk_OrthoMatrix &, const fk_Matrix &)
fk_Matrix | operator- (const fk_Matrix &, const fk_OrthoMatrix &)
fk_Matrix | operator- (const fk_OrthoMatrix &, const fk_Matrix &)

## 説明

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

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

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

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

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

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

参照:
  fk_Matrix, fk_GenMatrix, fk_Vector, fk_HVector, fk_Angle

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

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

コンストラクタ

単位行列を生成します。

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

コピーコンストラクタ

## 関数

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

逆行列取得演算子

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

        M_new = !M_org;

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

fk_Matrixで再定義されています。

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

成分参照演算子

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

        M[1][2] = 1.0;

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

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

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

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

同値比較演算子

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

        if(M1 == M2) {
            :
            :
        }

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

fk_Matrixで再定義されています。

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

異値比較演算子

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

        if(M1 != M2) {
            :
            :
        }

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

fk_Matrixで再定義されています。

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

単純代入演算子

fk_Matrixで再定義されています。

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

行列積代入演算子

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

        M1 *= M2;

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

        M1 = M1 * M2;

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

fk_Matrixで再定義されています。

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

単位行列化関数

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

void 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 を用いてください。

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

逆行列化関数

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

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

覚え書き:
  直交行列の場合、この関数は negate() でもまったく同様に動作します。 negate() と異なる唯一の点は、返り値の有無です。

fk_Matrixで再定義されています。

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

転置化関数

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

覚え書き:
  直交行列の場合、この関数は inverse() でもまったく同様に動作します。 inverse() と異なる唯一の点は、返り値の有無です。

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

座標軸回転行列生成関数

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

引数:

  `[in]` | rad | 回転角。単位は弧度法(ラジアン)です。
  `[in]` | axis | 座標軸。 fk_X, fk_Y, fk_Z のいずれかになります。

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

平行移動行列生成関数1

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

引数:

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

void fk_OrthoMatrix::makeTrans | ( | const fk_Vector & | v | ) |

平行移動行列生成関数2

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

引数:

  `[in]` | v | 移動ベクトル

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

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

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

引数:

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

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

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

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

引数:

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

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

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

fk_Matrixで再定義されています。

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

fk_Matrixで再定義されています。

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

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

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

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

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

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