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
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;
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
00118
00119
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
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
00150
00151
00152
00153 bool Vector4::Compare( const Vector4& right, const double& tol) const
00154 {
00155
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
00166 return true ;
00167 }
00168
00169 void Vector4::Normalize ()
00170 {
00171 *this = *this * ( 1.0 / Magnitude() );
00172 }
00173
00174
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
00199
00200
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
00214
00215
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
00229
00230
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() ;
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
00259 double temp;
00260 is >> temp;
00261 delimiter = is.get();
00262 assert(delimiter == ']') ;
00263 }
00264 return is ;
00265 };
00266