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 }