FineKernelToolKit 4.2.13
|
4元正方直交行列を管理するクラス [詳解]
#include <FK/Matrix.h>
公開メンバ関数 | |
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::fk_OrthoMatrix::fk_OrthoMatrix | ( | void | ) |
コンストラクタ
単位行列を生成します。
FK::fk_OrthoMatrix::fk_OrthoMatrix | ( | const fk_OrthoMatrix & | ) |
コピーコンストラクタ
FK::fk_OrthoMatrix::~fk_OrthoMatrix | ( | ) |
デストラクタ
fk_OrthoMatrix FK::fk_OrthoMatrix::operator! | ( | void | ) | const |
逆行列取得演算子
以下のコードは、M_org の逆行列を M_new に代入します。
M_new = !M_org;
このとき、M_org は変化しません。
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) \]
bool FK::fk_OrthoMatrix::operator== | ( | const fk_OrthoMatrix & | ) | const |
同値比較演算子
fk_OrthoMatrix では、以下のように記述することで、 M1 と M2 が等しいかどうかを判断できます。
if(M1 == M2) { : : }
ここでの比較は、各成分の比較において fk_Vector::MATRIXEPS までの数値誤差を許容しています。
bool FK::fk_OrthoMatrix::operator!= | ( | const fk_OrthoMatrix & | ) | const |
異値比較演算子
fk_OrthoMatrix では、以下のように記述することで、 M1 と M2 が等しくないかどうかを判断できます。
if(M1 != M2) { : : }
ここでの比較は、各成分の比較において fk_Vector::MATRIXEPS までの数値誤差を許容しています。
fk_OrthoMatrix & FK::fk_OrthoMatrix::operator= | ( | const fk_OrthoMatrix & | ) |
単純代入演算子
fk_OrthoMatrix & FK::fk_OrthoMatrix::operator*= | ( | const fk_OrthoMatrix & | ) |
行列積代入演算子
以下のコードは、M1 と M2 の行列積を 前の M1 の値は破棄して改めて M1 に設定します。
M1 *= M2;
これは、以下のコードと同義です。
M1 = M1 * M2;
void FK::fk_OrthoMatrix::init | ( | void | ) |
行列を単位行列に初期化します。
void FK::fk_OrthoMatrix::set | ( | int | row, |
int | col, | ||
double | value | ||
) |
成分設定関数
行番号 row、列番号 col に対応する成分を value に設定します。 row, col はそれぞれ最初が 0、最後が 3 になります。
[in] | row | 行番号 |
[in] | col | 列番号 |
[in] | value | 設定する成分の値 |
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 | 行ベクトル |
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 | 行ベクトル |
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 | 行ベクトル |
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 | 行ベクトル |
fk_HVector FK::fk_OrthoMatrix::getRow | ( | int | row | ) |
行ベクトル成分取得関数
行列中の、行番号が row である行ベクトルを返します。 row は最初が 0、最後が 3 となります。
[in] | row | 行番号 |
fk_HVector FK::fk_OrthoMatrix::getCol | ( | int | col | ) |
列ベクトル成分取得関数
行列中の、列番号が col である列ベクトルを返します。 col は最初が 0、最後が 3 となります。
[in] | col | 列番号 |
bool FK::fk_OrthoMatrix::inverse | ( | void | ) |
逆行列化関数
現在設定されている行列に対し、自身を逆行列化します。
void FK::fk_OrthoMatrix::negate | ( | void | ) |
void FK::fk_OrthoMatrix::makeRot | ( | double | rad, |
fk_Axis | axis | ||
) |
座標軸回転行列生成関数
座標軸回転変換を表す行列を生成します。
[in] | rad | 回転角。単位は弧度法(ラジアン)です。 |
[in] | axis | 座標軸。 |
void FK::fk_OrthoMatrix::makeTrans | ( | double | x, |
double | y, | ||
double | z | ||
) |
平行移動行列生成関数1
平行移動変換を表す行列を生成します。
[in] | x | 移動ベクトルの x 成分 |
[in] | y | 移動ベクトルの y 成分 |
[in] | z | 移動ベクトルの z 成分 |
void FK::fk_OrthoMatrix::makeTrans | ( | const fk_Vector & | V | ) |
平行移動行列生成関数2
平行移動変換を表す行列を生成します。
[in] | V | 移動ベクトル |
void FK::fk_OrthoMatrix::makeEuler | ( | double | h, |
double | p, | ||
double | b | ||
) |
オイラー角回転行列生成関数1
オイラー角による合成回転変換を表す行列を生成します。 オイラー角については、 fk_Angle を参照して下さい。
[in] | h | ヘディング角 |
[in] | p | ピッチ角 |
[in] | b | バンク角 |