00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00023
00024 #ifndef GTMLIB__MATH__VECTOR__HXX
00025 #define GTMLIB__MATH__VECTOR__HXX
00026
00027 #include "mathdefs.h"
00028 #include "vmfuncs.h"
00029
00031
00032 #define ROW_VECTOR 0x01
00033 #define COL_VECTOR 0x02
00034
00035
00036 namespace gtm
00037 {
00038 template< class T >
00039 class TMatrix;
00040
00047 template< class T >
00048 class TVector
00049 {
00050 public:
00051
00062
00063 TVector( uint N = 3, T data = ( T )0, int type = COL_VECTOR );
00065 TVector( const TVector< T >& r );
00067 TVector( T* block, uint N, bool copy = true, int type = COL_VECTOR );
00069
00071 ~TVector( ) {
00072 if( _myMemory ) VectorFreeMemory< T >( _vector );
00073 };
00074
00076 void SetN( uint N );
00077
00083
00084 TVector< T >& operator=( const TVector< T >& r );
00086 TVector< T >& operator=( TMatrix< T >& r );
00088 TVector< T >& operator=( T* r ) {
00089 VectorAssignMemory< T >( _vector, r, _N );
00090 return( *this );
00091 };
00093 TVector< T >& operator=( T r ) {
00094 VectorAssignScalar< T >( _vector, r, _N );
00095 return( *this );
00096 };
00098
00104
00105 bool operator==( const TVector< T >& r );
00107 bool operator!=( const TVector< T >& r );
00109
00111 T& operator()( uint i ) {
00112 return( _vector[ i ] );
00113 };
00115 T* GetAnsiRef( ) {
00116 return( _vector );
00117 };
00119 uint GetN( ) {
00120 return( _N );
00121 };
00123 int GetType( ) {
00124 return( _type );
00125 };
00127 T GetNorm( ) {
00128 return( VectorNorm< T >( _vector, _N ) );
00129 };
00131 void Normalize( ) {
00132 VectorNormalize< T >( _vector, _vector, _N );
00133 };
00135 T Dot( const TVector< T >& r ) {
00136 return( VectorDotProduct< T >( _vector, r._vector, GTM_MIN( _N, r._N ) ) );
00137 };
00138
00144
00145 TVector< T > operator+( const TVector< T >& r );
00147 TVector< T > operator-( const TVector< T >& r );
00149 TVector< T > operator*( const TVector< T >& r );
00151 TMatrix< T > operator*( TMatrix< T >& r );
00153 TVector< T > operator*( T r );
00155
00161
00162 TVector< T >& operator+=( const TVector< T >& r ) {
00163 *this = *this + r;
00164 return( *this );
00165 };
00167 TVector< T >& operator-=( const TVector< T >& r ) {
00168 *this = *this - r;
00169 return( *this );
00170 };
00172 TVector< T >& operator*=( const TVector< T >& r ) {
00173 *this = *this * r;
00174 return( *this );
00175 };
00177 TVector< T >& operator*=( T r ) {
00178 *this = *this * r;
00179 return( *this );
00180 };
00182
00184
00185
00186 TVector< T > operator-( );
00188 TVector< T > operator!( );
00190 TVector< T > operator~( );
00192
00193 private:
00194
00196
00197
00198 T* _vector;
00200 uint _N;
00202 int _type;
00204 bool _myMemory;
00206
00207 };
00208
00209
00210 template< class T >
00211 TVector< T >::TVector( uint N, T data, int type )
00212 {
00213 _N = N;
00214 _type = type;
00215 _vector = VectorAllocateMemory< T >( _N );
00216 _myMemory = true;
00217 VectorAssignScalar< T >( _vector, data, _N );
00218
00219 }
00220
00221
00222 template< class T >
00223 TVector< T >::TVector( const TVector< T >& r )
00224 {
00225 _N = r._N;
00226 _type = r._type;
00227 _myMemory = true;
00228 _vector = VectorCopyMemory< T >( r._vector, _N );
00229
00230 }
00231
00232
00233 template< class T >
00234 TVector< T >::TVector( T* block, uint N, bool copy, int type )
00235 {
00236 _N = N;
00237 _type = type;
00238 _myMemory = copy;
00239 _vector = ( copy )? VectorCopyMemory< T >( block, _N ): block;
00240
00241 }
00242
00243
00244 template< class T >
00245 void TVector< T >::SetN( uint N )
00246 {
00247 if( _myMemory ) VectorFreeMemory< T >( _vector );
00248 _N = N;
00249 _vector = VectorAllocateMemory< T >( _N );
00250 _myMemory = true;
00251 VectorAssignScalar< T >( _vector, ( T )0, _N );
00252
00253 }
00254
00255
00256 template< class T >
00257 TVector< T >& TVector< T >::operator=( const TVector< T >& r )
00258 {
00259
00260
00261
00262 _type = r._type;
00263 VectorAssignMemory< T >( _vector, r._vector, GTM_MIN( _N, r._N ) );
00264 return( *this );
00265
00266 }
00267
00268
00269 template< class T >
00270 bool TVector< T >::operator==( const TVector< T >& r )
00271 {
00272 uint i;
00273 bool ret;
00274
00275 for(
00276 i = 0, ret = ( _N == r._N );
00277 i < _N && ret;
00278 ret &= ( _vector[ i ] == r._vector[ i ] ), i++
00279 );
00280 return( ret );
00281
00282 }
00283
00284
00285 template< class T >
00286 bool TVector< T >::operator!=( const TVector< T >& r )
00287 {
00288 uint i;
00289 bool ret;
00290
00291 for(
00292 i = 0, ret = ( _N != r._N );
00293 i < _N && !ret;
00294 ret |= ( _vector[ i ] != r._vector[ i ] ), i++
00295 );
00296 return( ret );
00297
00298 }
00299
00300
00301 template< class T >
00302 TVector< T > TVector< T >::operator+( const TVector< T >& r )
00303 {
00304 TVector< T > ret( GTM_MIN( _N, r._N ) );
00305
00306 VectorAdd< T >( ret._vector, _vector, r._vector, GTM_MIN( _N, r._N ) );
00307 return( ret );
00308
00309 }
00310
00311
00312 template< class T >
00313 TVector< T > TVector< T >::operator-( const TVector< T >& r )
00314 {
00315 TVector< T > ret( GTM_MIN( _N, r._N ) );
00316
00317 VectorSubtract< T >( ret._vector, _vector, r._vector, GTM_MIN( _N, r._N ) );
00318 return( ret );
00319
00320 }
00321
00322
00323 template< class T >
00324 TVector< T > TVector< T >::operator*( const TVector< T >& r )
00325 {
00326 TVector< T > ret( GTM_MIN( _N, r._N ) );
00327
00328 VectorCrossProduct< T >( ret._vector, _vector, r._vector );
00329 return( ret );
00330
00331 }
00332
00333
00334 template< class T >
00335 TVector< T > TVector< T >::operator*( T r )
00336 {
00337 TVector< T > ret( _N );
00338
00339 VectorScalarProduct< T >( ret._vector, _vector, r, _N );
00340 return( ret );
00341
00342 }
00343
00344
00345 template< class T >
00346 TVector< T > TVector< T >::operator-( )
00347 {
00348 TVector< T > ret( _N );
00349 uint i;
00350
00351 for( i = 0; i < _N; ret._vector[ i ] = ( T )0 - _vector[ i ], i++ );
00352 return( ret );
00353
00354 }
00355
00356
00357 template< class T >
00358 TVector< T > TVector< T >::operator!( )
00359 {
00360 TVector< T > ret( _N );
00361
00362 VectorNormalize< T >( ret._vector, _vector, _N );
00363 return( ret );
00364
00365 }
00366
00367
00368 template< class T >
00369 TVector< T > TVector< T >::operator~( )
00370 {
00371 TVector< T > ret = *this;
00372
00373 ret._type = ( _type == COL_VECTOR )? ROW_VECTOR: COL_VECTOR;
00374 return( ret );
00375
00376 }
00377
00378 }
00379
00380 #endif // GTMLIB__MATH__VECTOR__HXX
00381
00382