Go to the documentation of this file.00001
00002
00003
00004
00005
00006 template<typename Real>
00007 v3<Real>& v3<Real>::set(const Real x, const Real y, const Real z){
00008 v[0] = x;
00009 v[1] = y;
00010 v[2] = z;
00011 return *this;
00012 }
00013
00014 template<typename Real>
00015 v3<Real>& v3<Real>::get(Real& x, Real& y, Real& z){
00016 x = v[0];
00017 y = v[1];
00018 z = v[2];
00019 return *this;
00020 }
00021
00022 template<typename Real>
00023 v3<Real>& v3<Real>::zero(void){
00024 x = Real(0);
00025 y = Real(0);
00026 z = Real(0);
00027 return *this;
00028 }
00029
00030 template<typename Real>
00031 v3<Real>& v3<Real>::identity(void){
00032 x = Real(1);
00033 y = Real(1);
00034 z = Real(1);
00035 return *this;
00036 }
00037
00038 template<typename Real>
00039 Real v3<Real>::length(void){
00040 return sqrt(x*x + y*y + z*z);
00041 }
00042
00043 template<typename Real>
00044 Real v3<Real>::length2(void){
00045 return x*x + y*y + z*z;
00046 }
00047
00048 template<typename Real>
00049 v3<Real>& v3<Real>::normalize(void){
00050 const Real l = length();
00051 x /= l;
00052 y /= l;
00053 z /= l;
00054 return *this;
00055 }
00056
00057
00058
00059
00060
00061 template<typename Real>
00062 v3<Real>& v3<Real>::operator = (const v3& a){
00063 x = a.x;
00064 y = a.y;
00065 z = a.z;
00066 return *this;
00067 }
00068
00069 template<typename Real>
00070 v3<Real>& v3<Real>::operator += (const v3& a){
00071 x += a.x;
00072 y += a.y;
00073 z += a.z;
00074 return *this;
00075 }
00076
00077 template<typename Real>
00078 v3<Real>& v3<Real>::operator -= (const v3& a){
00079 x -= a.x;
00080 y -= a.y;
00081 z -= a.z;
00082 return *this;
00083 }
00084
00085 template<typename Real>
00086 v3<Real>& v3<Real>::operator *= (const Real a){
00087 x *= a;
00088 y *= a;
00089 z *= a;
00090 return *this;
00091 }
00092
00093 template<typename Real>
00094 v3<Real>& v3<Real>::operator /= (const Real a){
00095 x /= a;
00096 y /= a;
00097 z /= a;
00098 return *this;
00099 }
00100
00101 template<typename Real>
00102 bool v3<Real>::operator == (const v3& vec){
00103 return
00104 (v[0] == vec[0]) &&
00105 (v[1] == vec[1]) &&
00106 (v[2] == vec[2]);
00107 }
00108
00109 template<typename Real>
00110 bool v3<Real>::operator != (const v3& vec){
00111 return
00112 (v[0] != vec[0]) ||
00113 (v[1] != vec[1]) ||
00114 (v[2] != vec[2]);
00115 }
00116
00117 template<typename Real>
00118 Real& v3<Real>::operator [] (const uchar i){
00119 assert(i<3);
00120 return v[i];
00121 }
00122
00123 template<typename Real>
00124 const Real v3<Real>::operator [] (const uchar i) const{
00125 assert(i<3);
00126 return v[i];
00127 }
00128
00129 template<typename Real>
00130 Real& v3<Real>::operator () (const uchar i){
00131 assert(i<3);
00132 return v[i];
00133 }
00134
00135 template<typename Real>
00136 const Real v3<Real>::operator () (const uchar i) const{
00137 assert(i<3);
00138 return v[i];
00139 }
00140
00141
00142
00143
00144
00145 template<typename Real>
00146 v3<Real> Zero3(void){
00147 return v3<Real>(0.f,0.f,0.f);
00148 }
00149
00150 template<typename Real>
00151 v3<Real> Identity3(void){
00152 return v3<Real>(1.f,1.f,1.f);
00153 }
00154
00155 template<typename Real>
00156 v3<Real> cross(const v3<Real>& a, const v3<Real>& b){
00157 return v3<Real>(
00158 a.y * b.z - a.z * b.y,
00159 a.z * b.x - a.x * b.z,
00160 a.x * b.y - a.y * b.x);
00161 }
00162
00163 template<typename Real>
00164 Real lengthSQ(const v3<Real>& a){
00165 return a[0]*a[0] + a[1]*a[1] + a[2]*a[2];
00166 }
00167
00168 template<typename Real>
00169 Real length(const v3<Real>& a){
00170 return sqrt(lengthSQ(a));
00171 }
00172
00173 template<typename Real>
00174 Real length(const v3<Real>& from, const v3<Real>& to){
00175 return length(to - from);
00176 }
00177
00178 template<typename Real>
00179 Real lengthSQ(const v3<Real>& from, const v3<Real>& to){
00180 return lengthSQ(to - from);
00181 }
00182
00183 template<typename Real>
00184 v3<Real> proj(const v3<Real>& a, const v3<Real>& on){
00185 const Real f = (on*a) / (on*on);
00186 return v3<Real>(on[0]*f, on[1]*f, on[2]*f);
00187 }
00188
00189 template<typename Real>
00190 v3<Real> projU(const v3<Real>& a, const v3<Real>& on){
00191 const Real f = on*a;
00192 return v3<Real>(on[0]*f, on[1]*f, on[2]*f);
00193 }
00194
00195 template<typename Real>
00196 v3<Real> normalize(const v3<Real>& v){
00197 const Real l = invsqrt(lengthSQ(v));
00198 return v3<Real>(v[0]*l, v[1]*l, v[2]*l);
00199 }
00200
00201 template<typename Real>
00202 Real dot(const v3<Real>& a, const v3<Real>& b){
00203 return a*b;
00204 }
00205
00206
00207
00208
00209
00210 template<typename Real>
00211 Real operator * (const v3<Real>& a, const v3<Real>& b){
00212 return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
00213 }
00214
00215 template<typename Real>
00216 v3<Real> operator * (const Real a, const v3<Real>& b){
00217 return v3<Real>(a*b.x, a*b.y, a*b.z);
00218 }
00219
00220 template<typename Real>
00221 v3<Real> operator * (const v3<Real>& a, const Real b){
00222 return v3<Real>(a.x*b, a.y*b, a.z*b);
00223 }
00224
00225 template<typename Real>
00226 v3<Real> operator / (const Real a, const v3<Real>& b){
00227 return v3<Real>(b.x/a, b.y/a, b.z/a);
00228 }
00229
00230 template<typename Real>
00231 v3<Real> operator / (const v3<Real>& a, const Real b){
00232 return v3<Real>(a.x/b, a.y/b, a.z/b);
00233 }
00234
00235 template<typename Real>
00236 v3<Real> operator + (const v3<Real>& a, const v3<Real>& b){
00237 return v3<Real>(a.x+b.x, a.y+b.y, a.z+b.z);
00238 }
00239
00240 template<typename Real>
00241 v3<Real> operator - (const v3<Real>& a){
00242 return v3<Real>(-a.x, -a.y, -a.z);
00243 }
00244
00245 template<typename Real>
00246 v3<Real> operator - (const v3<Real>& a, const v3<Real>& b){
00247 return v3<Real>(a.x-b.x, a.y-b.y, a.z-b.z);
00248 }