vector.h

Go to the documentation of this file.
00001 
00002 // vector.h
00003 // Creation : 24/02/2000
00004 // Author   : Leonardo FLOREZ VALENCIA
00005 //               l-florez@uniandes.edu.co
00006 //               lflorez@creatis.insa-lyon.fr
00007 // Copyright (C) 2000-2002 Leonardo FLOREZ VALENCIA
00008 //
00009 // This program is free software; you can redistribute it and/or
00010 // modify it under the terms of the GNU General Public License
00011 // as published by the Free Software Foundation; either version 2
00012 // of the License, or (at your option) any later version.
00013 //
00014 // This program is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 // GNU General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU General Public License
00020 // along with this program; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
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          * Only assigns the minimum cardinality (WARNING WITH NON-LOCAL MEMORY).
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 } // namespace
00379 
00380 #endif // GTMLIB__MATH__VECTOR__HXX
00381 
00382 // EOF - vector.h

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1