FineKernelToolKit  2.8.10
Public メソッド
クラス 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_OrthoMatrixoperator= (const fk_OrthoMatrix &)
 単純代入演算子
fk_OrthoMatrixoperator*= (const fk_OrthoMatrix &)
 行列積代入演算子
メンバ関数
void init (void)
 単位行列化関数
void set (int row, int col, double value)
 成分設定関数
void setRow (int row, const fk_Vector &vec)
 行ベクトル成分設定関数1
void setRow (int row, const fk_HVector &vec)
 行ベクトル成分設定関数2
void setCol (int col, const fk_Vector &vec)
 列ベクトル成分設定関数1
void setCol (int col, const fk_HVector &vec)
 列ベクトル成分設定関数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)
 オイラー角回転行列生成関数1

フレンド

二項演算子
fk_HVector operator* (const fk_OrthoMatrix &, const fk_HVector &)
 ベクトル変換二項演算子
fk_OrthoMatrix operator* (const fk_OrthoMatrix &, const fk_OrthoMatrix &)
 行列積二項演算子1
fk_Matrix operator* (const fk_Matrix &, const fk_OrthoMatrix &)
 行列積二項演算子2
fk_Matrix operator* (const fk_OrthoMatrix &, const fk_Matrix &)
 行列積二項演算子3
fk_Matrix operator+ (const fk_Matrix &, const fk_OrthoMatrix &)
 行列和二項演算子1
fk_Matrix operator+ (const fk_OrthoMatrix &, const fk_Matrix &)
 行列和二項演算子2
fk_Matrix operator- (const fk_Matrix &, const fk_OrthoMatrix &)
 行列差二項演算子1
fk_Matrix operator- (const fk_OrthoMatrix &, const fk_Matrix &)
 行列差二項演算子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::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  )

成分参照演算子

行列中の各成分を直接参照する場合や、 直接代入する場合は配列演算子を用います。 以下のコードは、行列 $\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 を用いてください。
bool fk_OrthoMatrix::operator== ( const fk_OrthoMatrix ) const

同値比較演算子

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

    if(M1 == M2) {
        :
        :
    }

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

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

異値比較演算子

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

    if(M1 != M2) {
        :
        :
    }

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

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;
覚え書き:
行列積は交換法則が成り立たないため、 $ \mathbf{M}_2\mathbf{M}_1 $$ \mathbf{M}_1 $ に代入したいときには、この演算子は利用できません。

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 を用いてください。
void fk_OrthoMatrix::setRow ( int  row,
const fk_Vector vec 
)

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

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

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

    M.setRow(row, vec);
    M[row][0] = vec.x;
    M[row][1] = vec.y;
    M[row][2] = vec.z;
void fk_OrthoMatrix::setRow ( int  row,
const fk_HVector vec 
)

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

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

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

    M.setRow(row, vec);
    M[row][0] = vec.x;
    M[row][1] = vec.y;
    M[row][2] = vec.z;
    M[row][3] = vec.w;
void fk_OrthoMatrix::setCol ( int  col,
const fk_Vector vec 
)

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

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

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

    M.setCol(col, vec);
    M[0][col] = vec.x;
    M[1][col] = vec.y;
    M[2][col] = vec.z;
void fk_OrthoMatrix::setCol ( int  col,
const fk_HVector vec 
)

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

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

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

    M.setCol(col, vec);
    M[0][col] = vec.x;
    M[1][col] = vec.y;
    M[2][col] = vec.z;
    M[3][col] = vec.w;
fk_HVector fk_OrthoMatrix::getRow ( int  row)

行ベクトル成分取得関数

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

戻り値:
行ベクトル
fk_HVector fk_OrthoMatrix::getCol ( int  col)

列ベクトル成分取得関数

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

戻り値:
列ベクトル
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]

ベクトル変換二項演算子

4次元ベクトル V1 の、直交行列 M による変換ベクトル V2 を求めるには、 以下のように記述します。 V1, V2 は共に fk_HVector 型の変数で、M は fk_OrthoMatrix 型の変数です。

    V2 = M * V1;

FK では行列体系として MV 系を採用しており、 行列のベクトル変換の際には行列が左側、ベクトルが右側である必要があります。

以下のコードは、fk_HVector 型の変数 V_org を fk_OrthoMatrix 型の変数 M によって変換した値を、 fk_HVector 型変数 V_new に代入します。

    V_new = M * V_org;

FK では行列体系として MV 系を採用しており、 行列のベクトル変換の際には行列が左側、ベクトルが右側である必要があります。

fk_OrthoMatrix operator* ( const fk_OrthoMatrix ,
const fk_OrthoMatrix  
) [friend]

行列積二項演算子1

直交行列 M1, M2 の行列積 M3 を求めるには、 以下のように記述します。 M1, M2, M3 はいずれも fk_OrthoMatrix 型の変数です。

    M3 = M1 * M2;
覚え書き:
行列積は交換法則が成り立たないため、 $ \mathbf{M}_1\mathbf{M}_2 $$ \mathbf{M}_2\mathbf{M}_1 $ は一般的に結果が異なります。
fk_Matrix operator* ( const fk_Matrix ,
const fk_OrthoMatrix  
) [friend]

行列積二項演算子2

一般行列 M_ord と直交行列 M_ortho の行列積 M を求めるには、 以下のように記述します。 M_ord, M は fk_Matrix 型、M_ortho は fk_OrthoMatrix 型の変数です。

    M = M_ord * M_ortho;
覚え書き:
行列積は交換法則が成り立たないため、 $ \mathbf{M}_1\mathbf{M}_2 $$ \mathbf{M}_2\mathbf{M}_1 $ は一般的に結果が異なります。
fk_Matrix operator* ( const fk_OrthoMatrix ,
const fk_Matrix  
) [friend]

行列積二項演算子3

直交行列 M_ortho と一般行列 M_ord の行列積 M を求めるには、 以下のように記述します。 M_ord, M は fk_Matrix 型、M_ortho は fk_OrthoMatrix 型の変数です。

    M = M_ortho * M_ord;
覚え書き:
行列積は交換法則が成り立たないため、 $ \mathbf{M}_1\mathbf{M}_2 $$ \mathbf{M}_2\mathbf{M}_1 $ は一般的に結果が異なります。
fk_Matrix operator+ ( const fk_Matrix ,
const fk_OrthoMatrix  
) [friend]

行列和二項演算子1

一般行列 M_ord と直交行列 M_ortho の行列和 M を求めるには、 以下のように記述します。 M_ord, M は fk_Matrix 型、M_ortho は fk_OrthoMatrix 型の変数です。

    M = M_ord + M_ortho;
覚え書き:
行列和は交換法則が成り立ちます。
fk_Matrix operator+ ( const fk_OrthoMatrix ,
const fk_Matrix  
) [friend]

行列和二項演算子2

直交行列 M_ortho と一般行列 M_ord の行列和 M を求めるには、 以下のように記述します。 M_ord, M は fk_Matrix 型、M_ortho は fk_OrthoMatrix 型の変数です。

    M = M_ortho + M_ord;
覚え書き:
行列和は交換法則が成り立ちます。
fk_Matrix operator- ( const fk_Matrix ,
const fk_OrthoMatrix  
) [friend]

行列差二項演算子1

一般行列 M_ord と直交行列 M_ortho の行列差 M を求めるには、 以下のように記述します。 M_ord, M は fk_Matrix 型、M_ortho は fk_OrthoMatrix 型の変数です。

    M = M_ord - M_ortho;
覚え書き:
行列差は交換法則が成り立ちません。
fk_Matrix operator- ( const fk_OrthoMatrix ,
const fk_Matrix  
) [friend]

行列差二項演算子2

直交行列 M_ortho と一般行列 M_ord の行列差 M を求めるには、 以下のように記述します。 M_ord, M は fk_Matrix 型、M_ortho は fk_OrthoMatrix 型の変数です。

    M = M_ortho - M_ord;
覚え書き:
行列差は交換法則が成り立ちません。
 全て クラス ネームスペース ファイル 関数 変数 型定義 列挙型 列挙型の値 フレンド マクロ定義