FlowVis 1.0

FlowVis/Framework/vec3.cpp

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