////////////////////////////////////////////////////////
//  四元数クラス ヘッダファイル
//  Version 1.0 , 2008/3/30 , by Li Cheng
////////////////////////////////////////////////////////

#ifndef _QUATERNION_H_
#define	_QUATERNION_H_

////////////////////////////////////////////////////////
// 3次元ベクトルクラス
////////////////////////////////////////////////////////
class vector_3D
{
public:
	// ***** 要素
	double x;
	double y;
	double z;
	
	// ***** コンストラクタ
	vector_3D();
	vector_3D(double x_, double y_, double z_);
	
	// ***** 演算子
	void      operator =  (vector_3D V);	// 代入 =
	bool      operator == (vector_3D V);	// 等号 ==
	vector_3D operator +  (vector_3D V);	// 加算 +
	vector_3D operator -  (vector_3D V);	// 減算 -
	vector_3D operator *  (double k);		// 係数倍 *
};

// ***** スカラー積とベクトル積
// スカラー積
double    DotP  (vector_3D a, vector_3D b);
// ベクトル積
vector_3D CrossP(vector_3D a, vector_3D b);

////////////////////////////////////////////////////////
// 四元数クラス
////////////////////////////////////////////////////////
class quaternion
{
public:
	// ***** 要素
	// 実部
	double w;
	// 虚部
	double x;
	double y;
	double z;

	// ***** コンストラクタ
	quaternion();
	quaternion(double w_, double x_, double y_, double z_);
	quaternion(double w_, vector_3D V_);
	
	// ***** 演算子
	void       operator =  (quaternion Q);	// 代入 =
	bool       operator == (quaternion Q);	// 等号 ==
	quaternion operator +  (quaternion Q);	// 加算 +
	quaternion operator -  (quaternion Q);	// 減算 -
	quaternion operator *  (quaternion Q);	// 乗算 *
	quaternion operator *  (double k);		// 係数倍 *

	// ***** 四元共役
    quaternion cq ();
	
	// ***** 実部の虚部の設定/取得
	// 実部の設定
	void SetReal( double w_ );
	// 虚部の設定
	void SetImage( double x_, double y_, double z_ );
	void SetImage( vector_3D V_ );
	// 実部の取得
	double    Real();
	// 虚部の取得
	vector_3D Image();
};

// ***** デバッグ用
#define print_s(s)  printf( #s" = %10.3f\n", s)
#define print_v(v)  printf( #v" = (%10.3f,%10.3f,%10.3f)\n", (v).x, (v).y, (v).z)
#define print_q(q)  printf( #q" = (%10.3f,%10.3f,%10.3f,%10.3f)\n", (q).w, (q).x, (q).y, (q).z)

#endif
