FlowVis 1.0
|
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 }