Springhead
An open source physics engine for virtual reality, haptics and motion generation.

ファイル

ファイル  Affine.h
 2/3次元アフィン行列
 

ネームスペース

 Spr
 SpatialVector V(v, w) = [v; w]; SpatialTransform X(R, r) = [R^T, -R^T * r%; O, R^T]; ^Tは転置, は外積行列,Oは零行列. X(R, r) * V(v, w) = [R^T * (v + w % r); R^T * w];.
 

構成

class  TAffine2< T >
 TAffine2行列(回転,拡大,平行移動を表す)行列. [詳細]
 
class  TAffine< T >
 TAffine行列(回転,拡大,平行移動を表す)行列. [詳細]
 

マクロ定義

#define DEF_TAFFINE_CONSTRUCTORS(TAffine)
 TAffineのコンストラクタ定義のマクロ.コンストラクタは継承されないが, これをDefineすることで,コンストラクタを引き継ぐことができる.
 
#define DEF_TAFFINE_CONSTRUCTORS2(TAffine)
 TAffine2のコンストラクタ定義のマクロ.コンストラクタは継承されないが, これをDefineすることで,コンストラクタを引き継ぐことができる. [詳細]
 

型定義

typedef TAffine2< float > Affine2f
 float版2次元アフィン行列.
 
typedef TAffine2< double > Affine2d
 double版2次元アフィン行列.
 
typedef TAffine< float > Affinef
 float版3次元アフィン行列.
 
typedef TAffine< double > Affined
 double版3次元アフィン行列.
 

関数

template<class T >
abs (T t)
 
template<class T >
sign (T t)
 符号(正なら1, 負なら -1 を返す)
 
template<class T >
min (T a, T b)
 小さい方を返す
 
template<class T >
max (T a, T b)
 大きい方を返す
 
template<class T >
ave (T a, T b)
 平均をとる
 
double Rad (double deg)
 度をラジアンに変換
 
float Radf (double deg)
 
double Deg (double rad)
 ラジアンを度に変換
 
float Degf (double rad)
 
template<class SC >
SC Square (SC x)
 2乗
 
template<class SC >
SC Det2 (SC a, SC b, SC c, SC d)
 2x2行列の行列式
 
template<class TD , class TV >
TVec2< TV > operator* (const PTM::TMatrixBase< 3, 3, TD > &a, const TVec2< TV > &b)
 TAffine2とベクトルの掛け算
 
template<class TD , class TV >
TVec3< TV > operator* (const PTM::TMatrixBase< 4, 4, TD > &a, const TVec3< TV > &b)
 TAffineとベクトルの掛け算
 

変数

const double M_PI = 3.14159265358979323846
 円周率π
 

説明

1 はじめに

    このページはAffine行列クラス(Spr::TAffine, Spr::TAffine2)の説明です.
    Affine行列クラスライブラリは,3Dシミュレーションに必須な
    Affine行列をC++のクラスにしたものです.

2 使い方

Affine 行列クラスライブラリは,ヘッダファイルだけからなる
クラスライブラリなので, TAffine.h, TinyVec.h, TinyMat.h, TMatrix.h, TMatrixUtility.h, TVector.h
を同じフォルダに入れておき,.cppファイルからヘッダをインクルードするだけで
使用できます.

2.1  サンプル

#include "Affine.h"                         //  TAffine行列ライブラリのインクルードする.
#include <iostream>

using namespace Spr;    //   Affine行列クラスはSpr名前空間の中で宣言されている.@!EN Affine matrix class is declared in the name space of Spr.

void main(){
    Affinef af=Affinef::Rad(Rad(30), 'z');  //  要素がfloatなTAffine行列を宣言. 
                                                
                                                z軸回り30度回転行列に初期化
                                                
                                                
    Vec3f vec(1,0,0);                       //  要素がfloatな3次元のベクトルを宣言
                                                
    std::cout << af;
    std::cout << vec << std::endl;
    std::cout << af * vec << std::endl;
}

2.2  Affine行列・ベクトルのメンバと演算

普通に演算ができます.
<ul>
<li> +:和, -:差, *:積/内積, /:定数分の1
<li> ==:比較, =:代入
<li> <<:出力, >>:入力
<li> %:ベクトルの外積
</ul>


Affine変換は,
    TAffine<float> af; TVec3<float> v, af_v;
    af_v = af * v;

とすればできます.

また,次のようにTAffine行列の部分を取り出すことができます.
<ul>
    <li> af.Ex():   X軸基底ベクトル.(3次元ベクトル).
    <li> af.Ey():   Y軸基底ベクトル.(3次元ベクトル).
    <li> af.Ez():   Z軸基底ベクトル.(3次元ベクトル).
    <li> af.Trn():  平行移動部分.(3次元ベクトル).
    <li> af.Rot():  回転変換部分.(3×3行列).
</ul>

 部分への代入などもできます.
    TAffine<float> af;
    af.Pos() = Vec3f(10,0,0);
    af.Rot() = TAffine<float>::Rot(Rad(30), 'x').Rot() * af.Rot();

ベクトルは次のようなメンバ関数を持ちます.

2.3 Affine行列の初期化

TAffine行列(Spr::TAffine)には便利なコンストラクタや初期化関数を用意しました. いくつかをここで紹介します.

3 謝辞

LU分解,逆行列,ガウス消去法などの行列計算アルゴリズムは,
「『C言語による最新アルゴリズム事典』全ソースコード」
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms
奥村 晴彦 Haruhiko Okumura
を改変して流用させていただきました. 自由にコードを使えるよう公開してくださってありがとうございます.

4 リファレンス

ベクトル・行列・座標変換

マクロ定義

#define DEF_TAFFINE_CONSTRUCTORS2 (   TAffine)
値:
TAffine(element_type th, char axis) { \
*this=Rot(th, axis); \
} \
template <class BUF> \
TAffine(element_type th, char axis, \
const PTM::TVectorBase<3, BUF>& posi) { \
*this = Rot(th, axis); Pos() = posi; } \
template <class BUFA> \
TAffine(element_type th, const PTM::TVectorBase<3, BUFA>& axis){ \
*this = Rot(th, axis.unit()); \
} \
template <class BUFA, class BUFP> \
TAffine(element_type th, const PTM::TVectorBase<3, BUFA>& axis , const PTM::TVectorBase<3, BUFP>& posi){ \
*this = Rot(th, axis.unit()); Pos() = posi; \
} \
template <class BUFS, class BUFZ> \
TAffine(const PTM::TVectorBase<3, BUFS>& screen, const PTM::TVectorBase<2, BUFZ>& size, element_type front=1.0f, element_type back=10000.0f){ \
*this = ProjectionGL(screen, size, front, back); \
} \
template <class BUF, class BUFV> \
TAffine(const PTM::TMatrixOp<3, 3, BUF>& m, const PTM::TVectorBase<3, BUFV> posi){\
Rot() = m; Pos() = posi; ExW() = 0; EyW() = 0; EzW() = 0; PosW() = 1; \
}
次元をテンプレートで持つベクトルの基本型
Definition: TVector.h:72
ret_type unit() const
単位ベクトルを返す.
Definition: TVector.h:442