C:/Projekte/C++/FlowVIS_107/src/vec3.cpp

Go to the documentation of this file.
00001 #include "vec3.h"
00002 
00003 vec3::vec3()
00004 {
00005         v[0] = 0.0f;
00006         v[1] = 0.0f;
00007         v[2] = 0.0f;
00008 }
00009 
00010 vec3::vec3(float x, float y, float z)
00011 {
00012     v[0] = x;
00013     v[1] = y;
00014     v[2] = z;
00015 }
00016 
00017 vec3::vec3(const float* u)
00018 {
00019         v[0] = u[0];
00020         v[1] = u[1];
00021         v[2] = u[2];
00022 }
00023 
00024 //the copy constructor
00025 vec3::vec3(const vec3& u)
00026 {
00027         v[0] = u.v[0];
00028         v[1] = u.v[1];
00029         v[2] = u.v[2];
00030 }
00031 
00032 float& vec3::operator[](unsigned i)
00033 {
00034         return v[i]; //return the i-th component, allow also assignment
00035 }
00036 
00037 vec3& vec3::operator=(const vec3& u)
00038 {
00039         if (this != &u) //don't try to assign myself to me
00040         {
00041                 v[0] = u.v[0];
00042                 v[1] = u.v[1];
00043                 v[2] = u.v[2];
00044         }
00045         return *this;
00046 }
00047 //adds the value of u to this instance
00048 vec3& vec3::operator+=(const vec3& u)
00049 {
00050         v[0] += u.v[0];
00051         v[1] += u.v[1];
00052         v[2] += u.v[2];
00053         return *this;
00054 }
00055 
00056 vec3& vec3::operator-=(const vec3& u)
00057 {
00058         v[0] -= u.v[0];
00059         v[1] -= u.v[1];
00060         v[2] -= u.v[2];
00061         return *this;
00062 }
00063 
00064 vec3& vec3::operator*=(float t)
00065 {
00066         v[0] *= t;
00067         v[1] *= t;
00068         v[2] *= t;
00069         return *this;
00070 }
00071 
00072 vec3& vec3::operator/=(float t)
00073 {
00074         return *this *= (1/t); //do the same as by multiplication only with 1/t
00075 }
00076 
00077 //adds this instance's value to u and returns a new instance with the result
00078 const vec3 vec3::operator+(const vec3& u) const
00079 {
00080         return vec3(*this) += u; //make a copy of myself, same as vec3 result *this; use += to add v to the copy.
00081 }
00082 
00083 const vec3 vec3::operator-(const vec3& u) const
00084 {
00085         return vec3(*this) -= u;
00086 }
00087 
00088 const vec3 vec3::operator*(float t) const
00089 {
00090         return vec3(*this) *= t;
00091 }
00092 
00093 const vec3 vec3::operator/(float t) const
00094 {
00095         return vec3(*this) *= (1/t); 
00096 }
00097 //the opposite vector
00098 vec3& vec3::operator-()
00099 {
00100         return (*this) *= -1.0f;
00101 }
00102 //norm, the dot product of the vector with himself
00103 inline float vec3::norm() const
00104 {
00105         return v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
00106 }
00107 //euclidian distance
00108 inline float vec3::length() const
00109 {
00110         return sqrt(norm());
00111 }
00112 
00113 //normalizes the vector
00114 vec3& vec3::normalize()
00115 {
00116   float len = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
00117   if(len != 0)
00118   {
00119     v[0] /= len;
00120     v[1] /= len;
00121     v[2] /= len;
00122   }
00123         return *this;
00124 }
00125 
00126 //norm of the difference of u and this vector instance
00127 float vec3::dist2(const vec3& u)
00128 {
00129         return (*this - u).norm();
00130 }
00131 //length of the difference of u and this vector instance
00132 float vec3::dist(const vec3& u)
00133 {
00134         return (*this - u).length();
00135 }
00136 
00137 float vec3::operator*(const vec3& u) const
00138 {
00139         return (v[0]*u.v[0] + v[1]*u.v[1] + v[2]*u.v[2]); //return the dot product
00140 }
00141 
00142 const vec3 vec3::operator^(const vec3& u) const
00143 {
00144         return vec3(v[1]*u.v[2] - v[2]*u.v[1], v[2]*u.v[0] - v[0]*u.v[2], v[0]*u.v[1] - v[1]*u.v[0]); //return the cross product
00145 }
00146 
00147 bool vec3::operator==(const vec3 &u) const
00148 {
00149     return (v[0] == u.v[0])&&(v[1] == u.v[1])&&(v[2] == u.v[2]);
00150 }
00151 
00152 bool vec3::operator!=(const vec3 &u) const
00153 {
00154     return (v[0] != u.v[0])||(v[1] != u.v[1])||(v[2] != u.v[2]);
00155 }
00156 
00157 void vec3::print()
00158 {
00159         std::cout << *this << std::endl;
00160 }
00161 
00162 std::ostream& operator<<(std::ostream& os, const vec3& u)
00163 {
00164         os << u.v[0] << ", " << u.v[1] << ", " << u.v[2];
00165         return os;
00166 }

Generated on Mon Jan 21 14:50:12 2008 for VisLU by  doxygen 1.5.4