math/Vector4.cpp

Go to the documentation of this file.
00001 #include "../additional/streams/mystreams.h"
00002 #include <assert.h>
00003 #include <math.h>
00004 
00005 #include "Vector4.h"
00006 
00007 Vector4::Vector4 ()
00008 {
00009         elements[ 0 ] = 0.0;
00010         elements[ 1 ] = 0.0;
00011         elements[ 2 ] = 0.0;
00012 }
00013 
00014 Vector4::Vector4 (const Vector4& right)
00015 {
00016         elements[ 0 ] = right.elements[ 0 ];
00017         elements[ 1 ] = right.elements[ 1 ];
00018         elements[ 2 ] = right.elements[ 2 ];
00019 }
00020 
00021 Vector4 Vector4::operator + (const Vector4& right) const
00022 {
00023         double x = elements[ 0 ] + right.elements[ 0 ];
00024         double y = elements[ 1 ] + right.elements[ 1 ];
00025         double z = elements[ 2 ] + right.elements[ 2 ];
00026         return Vector4( x, y, z );
00027 }
00028 
00029 Vector4 Vector4::operator - (const Vector4& right) const
00030 {
00031         //Vector4 returnme ;
00032         double x = elements[ 0 ] - right.elements[ 0 ];
00033         double y = elements[ 1 ] - right.elements[ 1 ];
00034         double z = elements[ 2 ] - right.elements[ 2 ];
00035         return Vector4( x, y, z );
00036 }
00037 
00038 Vector4& Vector4::operator -= (const Vector4& right)
00039 {
00040         Vector4 tempResult = *this - right;                     //IMPROVE: this is not efficient
00041         *this = tempResult;             
00042         return *this;
00043 }
00044 
00045 
00046 Vector4 Vector4::operator * (const double right) const
00047 {
00048         double x = elements[ 0 ] * right;
00049         double y = elements[ 1 ] * right;
00050         double z = elements[ 2 ] * right;
00051         return Vector4( x, y, z );
00052 }
00053 
00054 Vector4 Vector4::operator / (const double right) const
00055 {
00056         double x = elements[ 0 ] / right;
00057         double y = elements[ 1 ] / right;
00058         double z = elements[ 2 ] / right;
00059         return Vector4( x, y, z );
00060 }
00061 
00062 double Vector4::Magnitude () const
00063 {
00064         return sqrt( elements[ 0 ] * elements[ 0 ] + elements[ 1 ] * elements[ 1 ] + elements[ 2 ] * elements[ 2 ] ) ;
00065 }
00066 
00067 double Vector4::MagSquared () const
00068 {
00069         return elements[ 0 ] * elements[ 0 ] + elements[ 1 ] * elements[ 1 ] + elements[ 2 ] * elements[ 2 ];
00070 }
00071 
00072 double Vector4::Dot (const Vector4& right) const
00073 {
00074         double returnMe = 0 ;
00075         for( int i = 0; i < 3; i++ )
00076         {
00077                 returnMe += elements[ i ] * right[ i ] ;
00078         }
00079         return returnMe ;
00080 }
00081 
00082 Vector4 Vector4::Cross (const Vector4& right) const
00083 {
00084         const double& ax = elements[ 0 ] ;
00085         const double& ay = elements[ 1 ] ;
00086         const double& az = elements[ 2 ] ;
00087         const double& bx = right.elements[ 0 ] ;
00088         const double& by = right.elements[ 1 ] ;
00089         const double& bz = right.elements[ 2 ] ;
00090 
00091         Vector4 returnMe ;
00092         returnMe[ 0 ] = ay * bz - az * by ;
00093         returnMe[ 1 ] = az * bx - ax * bz ;
00094         returnMe[ 2 ] = ax * by - ay * bx ;
00095         return returnMe ;
00096 }
00097 
00098 Vector4 Vector4::Projection (const Vector4& right) const
00099 {
00100         const Vector4& b = right ;
00101         return b * ProjectionMag( right ) ;
00102 }
00103 
00104 double Vector4::ProjectionMag (const Vector4& right) const
00105 {
00106         const Vector4& a = *this ;
00107         const Vector4& b = right ;
00108 
00109         double num = a.Dot( b ) ;
00110         double den = b.Dot( b ) ;
00111         assert( den != 0 ) ;
00112 
00113         return ( num / den ) ;
00114 }
00115 
00116 //=============================================================================
00117 // Reflect
00118 //
00119 // Description: Reflects this vector about a normal
00120 //=============================================================================
00121 void Vector4::Reflect( const Vector4& normal )
00122 {
00123         Vector4 projection = this->Projection( normal );
00124         *this -= ( projection * 2 ) ;
00125 }
00126 
00127 bool Vector4::operator == (const Vector4& right) const
00128 {
00129     //no homogenous coords
00130     if( this->elements[ 0 ] != right[ 0 ] )
00131     {
00132             return false ;
00133     }
00134     else if( this->elements[ 1 ] != right[ 1 ] )
00135     {
00136             return false ;
00137     }
00138     else if( this->elements[ 2 ] != right[ 2 ] ) 
00139     {
00140             return false ;
00141     }
00142     else
00143     {
00144             return true ;
00145     }
00146 }
00147 
00148 //=============================================================================
00149 // Compare
00150 //
00151 // Description: Compares if two vectors are equal to within a given Tolerance.
00152 //=============================================================================
00153 bool Vector4::Compare( const Vector4& right, const double& tol) const
00154 {
00155         //test that the elements are the same
00156         for( int i = 0; i < 4; i++ )
00157         {
00158                 double diff = elements[ i ] - right[ i ];
00159                 if( (diff > tol) || (diff < (-tol)) )
00160                 {
00161                         return false ;
00162                 }
00163         }
00164 
00165         // if still in the function, then all elements are equal to within tol.
00166         return true ;
00167 }
00168 
00169 void Vector4::Normalize ()
00170 {
00171         *this = *this * ( 1.0 / Magnitude() );
00172 }
00173 
00174 // Additional Declarations
00175 //-----------------------------------------------------------------------------
00176 std::ostream & operator<<(std::ostream &os, const Vector4& v)
00177 {
00178         os << "[" 
00179                 << v[ 0 ] << " , " 
00180                 << v[ 1 ] << " , " 
00181                 << v[ 2 ]
00182                 << "]" ;
00183         return os ;
00184 }
00185 //-----------------------------------------------------------------------------
00186 bool Vector4::operator< ( const Vector4& right ) const
00187 {
00188         assert( false ) ;
00189         return false ;
00190 }
00191 //-----------------------------------------------------------------------------
00192 bool Vector4::operator !=( const Vector4& right ) const
00193 {
00194         return !( this->operator ==( right ) );
00195 }
00196 
00197 //=============================================================================
00198 // operator *=
00199 //
00200 // Description: in place scalar multiplication operator
00201 //=============================================================================
00202 Vector4& Vector4::operator *=( const double right )
00203 {
00204         int i; 
00205         for( i = 0; i < 3; i++ )
00206         {
00207                 elements[ i ] *= right;
00208         }
00209         return *this;
00210 }
00211 
00212 //=============================================================================
00213 // operator /=
00214 //
00215 // Description: in place scalar division operator
00216 //=============================================================================
00217 Vector4& Vector4::operator /=( const double right )
00218 {
00219         int i; 
00220         for( i = 0; i < 3; i++ )
00221         {
00222                 elements[ i ] /= right;
00223         }
00224         return *this;
00225 }
00226 
00227 //=============================================================================
00228 // operator *=
00229 //
00230 // Description: in place scalar multiplication operator
00231 //=============================================================================
00232 Vector4 Vector4::operator -() const
00233 {
00234         double x = -elements[ 0 ];
00235         double y = -elements[ 1 ];
00236         double z = -elements[ 2 ];
00237         return Vector4( x, y, z );
00238 }
00239 
00240 //-----------------------------------------------------------------------------
00241 std::istream & operator>>( std::istream &is, Vector4& v )
00242 {
00243         eatwhite( is ) ;
00244         char leading = is.get() ;                       //get the leading '['
00245         assert( leading == '[' ) ;
00246 
00247         char delimiter;
00248         for( int i = 0; i < 3; i++ ) 
00249         {
00250                 is >> v[ i ] ;
00251                 eatwhite( is ) ;
00252                 delimiter = is.get() ;
00253                 assert( ( delimiter == ',' ) || ( delimiter == ']' ) ) ;
00254         }
00255 
00256         if (delimiter != ']')
00257         {
00258                 //this is to get rid of the extra homogenous coordinate
00259                 double temp;
00260                 is >> temp;
00261                 delimiter = is.get();
00262                 assert(delimiter == ']') ;
00263         }
00264         return is ;
00265 };
00266 //-----------------------------------------------------------------------------

Generated on Sat Apr 1 21:30:38 2006 for Motion Planning Kernel by  doxygen 1.4.6-NO