メインページ | ネームスペース一覧 | クラス階層 | 構成 | Directories | ファイル一覧 | ネームスペースメンバ | 構成メンバ | ファイルメンバ | 関連ページ

TinyVec.h

00001 #ifndef TINYVEC_H
00002 #define TINYVEC_H
00003 
00004 #include <Base/TVector.h>
00005 
00006 #ifndef PTM_PACK    //  単体で使用する場合は,namespace に入れない
00007 namespace Spr{;
00008 #endif
00009 #ifdef _WIN32
00010  #pragma pack(push, 4)
00011 #endif
00012 
00013 //-----------------------------------------------------------------------------
00014 //      TVec2
00015 template <class EXP, class T> class TVecDesc: public PTM::TVectorDesc<1, EXP, EXP, T>{};
00016 /** 2次元ベクトルクラス */
00017 template<class T>
00018 class TVec2:public PTM::TVectorBase<DIMENC(2), TVecDesc<TVec2<T>, T> >{
00019 public:
00020     typedef TVecDesc<TVec2<T>, T> desc;
00021     typedef PTM::TVectorBase<DIMENC(2), desc> base_type;
00022     /// 基本的なメンバの定義 @see ::DEF_TVECTOR_BASIC_MEMBER
00023     DEF_TVECTOR_BASIC_MEMBER(TVec2);
00024 
00025     union{
00026         T data[2];
00027         struct{
00028             T x,y;
00029         };
00030     };
00031     /// 要素のアクセス
00032     T& item_impl(size_t i){ return data[i]; }
00033     /// 要素のアクセス
00034     const T& item_impl(size_t i) const { return data[i]; }
00035     /// ストライド
00036     size_t stride_impl() const { return 1; }
00037     ///@name 構築・初期化
00038     //@{
00039     /// コンストラクタ
00040     template <class TX, class TY>
00041         TVec2(TX xi, TY yi){ X() = element_type(xi); Y() = element_type(yi); }
00042     //@}
00043 
00044     ///@name 初期化関数
00045     //@{
00046     /// 零ベクトル
00047     static TVec2<T> Zero(){TVec2<T> v; v.clear(); return v;}
00048     //@}
00049 
00050     ///@name 変数アクセス
00051     //@{
00052     /// ベクトルのx成分
00053     const element_type& X() const { return item(0); }
00054     /// ベクトルのy成分
00055     const element_type& Y() const { return item(1); }
00056     /// ベクトルのx成分
00057     element_type& X() { return item(0); }
00058     /// ベクトルのy成分
00059     element_type& Y() { return item(1); }
00060     /// ベクトルのx成分
00061     const element_type& U() const { return item(0); }
00062     /// ベクトルのy成分
00063     const element_type& V() const { return item(1); }
00064     /// ベクトルのx成分
00065     element_type& U() { return item(0); }
00066     /// ベクトルのy成分
00067     element_type& V() { return item(1); }
00068     //@}
00069 protected:
00070     void set_default(){clear();}
00071 };
00072 
00073 //-----------------------------------------------------------------------------
00074 //      TVec3
00075 /// 3次元ベクトルクラス.
00076 template<class T>
00077 class TVec3:public PTM::TVectorBase<DIMENC(3), TVecDesc<TVec3<T>, T> >{
00078 public:
00079     typedef TVecDesc<TVec3<T>, T> desc;
00080     typedef PTM::TVectorBase<DIMENC(3), desc> base_type;
00081     /** 継承されない基本的なメンバの定義.
00082         @see ::DEF_TVECTOR_BASIC_MEMBER */
00083     DEF_TVECTOR_BASIC_MEMBER(TVec3);
00084     union{
00085         T data[3];
00086         struct{
00087             T x,y,z;
00088         };
00089     };
00090     /// 要素のアクセス
00091     T& item_impl(size_t i){ return data[i]; }
00092     /// 要素のアクセス
00093     const T& item_impl(size_t i) const { return data[i]; }
00094     /// ストライド
00095     size_t stride_impl() const { return 1; }
00096 
00097     ///@name 初期化関数
00098     //@{
00099     /// 零ベクトル
00100     static TVec3<T> Zero(){TVec3<T> v; v.clear(); return v;}
00101     //@}
00102     
00103     ///@name 変数アクセス
00104     //@{
00105     /// x成分
00106     const element_type& X() const { return item(0); }
00107     /// y成分
00108     const element_type& Y() const { return item(1); }
00109     /// z成分
00110     const element_type& Z() const { return item(2); }
00111     /// x成分
00112     element_type& X(){ return item(0); }
00113     /// y成分
00114     element_type& Y(){ return item(1); }
00115     /// z成分
00116     element_type& Z(){ return item(2); }
00117 
00118     const element_type& R() const { return item(0); }
00119     const element_type& G() const { return item(1); }
00120     const element_type& B() const { return item(2); }
00121     element_type& R(){ return item(0); }
00122     element_type& G(){ return item(1); }
00123     element_type& B(){ return item(2); }
00124     //@}
00125     
00126     ///@name 初期化・構築
00127     //@{
00128     /// コンストラクタ
00129     template <class TX, class TY, class TZ> TVec3 (TX xi, TY yi, TZ zi){ X() = element_type(xi); Y() = element_type(yi); Z() = element_type(zi); }
00130     //@}
00131     /** 内積(return *this * b).
00132         @param  b   同じサイズのベクトル.
00133         @return     内積の値(要素型)    */
00134     template <class D>
00135     element_type dot(const PTM::VectorImp<D>& b) const {
00136         assert(b.size() == size());
00137         return item(0)*b[0] + item(1)*b[1] + item(2)*b[2];
00138     }
00139 protected:
00140     void set_default(){clear();}
00141 };
00142 
00143 //-----------------------------------------------------------------------------
00144 //      TVec4
00145 /// 4次元ベクトルクラス.
00146 template<class T>
00147 class TVec4:public PTM::TVectorBase<DIMENC(4), TVecDesc<TVec4<T>, T> >{
00148 public:
00149     typedef TVecDesc<TVec4<T>, T> desc;
00150     typedef PTM::TVectorBase<DIMENC(4), desc> base_type;
00151     /** 継承されない基本的なメンバの定義.
00152         @see ::DEF_TVECTOR_BASIC_MEMBER */
00153     DEF_TVECTOR_BASIC_MEMBER(TVec4);
00154     union{
00155         T data[4];
00156         struct{
00157             T x,y,z,w;
00158         };
00159     };
00160     /// 要素のアクセス
00161     T& item_impl(size_t i){ return data[i]; }
00162     /// 要素のアクセス
00163     const T& item_impl(size_t i) const { return data[i]; }
00164     /// ストライド
00165     size_t stride_impl() const { return 1; }
00166 
00167     ///@name 初期化関数
00168     //@{
00169     /// 零ベクトル
00170     static TVec4<T> Zero(){TVec4<T> v; v.clear(); return v;}
00171     //@}
00172 
00173     ///@name 変数アクセス
00174     //@{
00175     /// x成分
00176     const element_type& X() const { return x; }
00177     /// y成分
00178     const element_type& Y() const { return y; }
00179     /// z成分
00180     const element_type& Z() const { return z; }
00181     /// w成分
00182     const element_type& W() const { return w; }
00183     /// x成分
00184     element_type& X(){ return x; }
00185     /// y成分
00186     element_type& Y(){ return y; }
00187     /// z成分
00188     element_type& Z(){ return z; }
00189     /// w成分
00190     element_type& W(){ return w; }
00191 
00192     const element_type& R() const { return x; }
00193     const element_type& G() const { return y; }
00194     const element_type& B() const { return z; }
00195     const element_type& A() const { return w; }
00196     element_type& R(){ return x; }
00197     element_type& G(){ return y; }
00198     element_type& B(){ return z; }
00199     element_type& A(){ return w; }
00200     //@}
00201     
00202     ///@name 初期化・構築
00203     //@{
00204     /// コンストラクタ
00205     template <class TX, class TY, class TZ, class TW>
00206     TVec4 (TX xi, TY yi, TZ zi, TW wi){ X() = element_type(xi); Y() = element_type(yi); Z() = element_type(zi); W() = element_type(wi);}
00207     //@}
00208 protected:
00209     void set_default(){clear();}
00210 };
00211 
00212 /// float版2次元ベクトル
00213 typedef TVec2<float> Vec2f;
00214 /// double版2次元ベクトル
00215 typedef TVec2<double> Vec2d;
00216 /// float版3次元ベクトル
00217 typedef TVec3<float> Vec3f;
00218 /// double版3次元ベクトル
00219 typedef TVec3<double> Vec3d;
00220 /// float版4次元ベクトル
00221 typedef TVec4<float> Vec4f;
00222 /// double版4次元ベクトル
00223 typedef TVec4<double> Vec4d;
00224 
00225 #ifdef _WIN32
00226 #pragma pack(pop)
00227 #endif
00228 
00229 #ifndef PTM_PACK    //  単体で使用する場合は,namespace に入れない
00230 }
00231 #endif
00232 
00233 #endif

Springheadに対してSun Apr 16 01:57:56 2006に生成されました。  doxygen 1.4.1