17 #include "Foundation/Matrix3.h"
20 VEC3_INLINE VecErr::VecErr(
const string& m):
MError(m)
22 message.insert(0,
"Vec3 ");
40 VEC3_INLINE
Vec3::Vec3(
double a,
double b,
double c)
56 VEC3_INLINE
Vec3& Vec3::operator=(
const Vec3& rhs)
64 VEC3_INLINE
Vec3& Vec3::operator=(
double s)
72 VEC3_INLINE
Vec3& Vec3::operator-=(
const Vec3& rhs)
80 VEC3_INLINE
Vec3& Vec3::operator+=(
const Vec3& rhs)
90 return Vec3(data[0]+rhs.data[0], data[1]+rhs.data[1], data[2]+rhs.data[2]);
95 return Vec3(data[0]-rhs.data[0], data[1]-rhs.data[1], data[2]-rhs.data[2]);
100 return Vec3( -data[0],-data[1],-data[2] );
103 VEC3_INLINE
Vec3 Vec3::operator*(
const Matrix3 &m)
const
105 const double x = m(0,0)*data[0] + m(1,0)*data[1] + m(2,0)*data[2];
106 const double y = m(0,1)*data[0] + m(1,1)*data[1] + m(2,1)*data[2];
107 const double z = m(0,2)*data[0] + m(1,2)*data[1] + m(2,2)*data[2];
112 VEC3_INLINE
double Vec3::operator*(
const Vec3& rhs)
const
114 return data[0]*rhs.data[0]+data[1]*rhs.data[1]+data[2]*rhs.data[2];
117 VEC3_INLINE
Vec3 Vec3::operator*(
double s)
const
119 return Vec3(data[0]*s,data[1]*s,data[2]*s) ;
122 VEC3_INLINE
Vec3& Vec3::operator*=(
double rhs)
130 VEC3_INLINE
Vec3& Vec3::operator/=(
double c)
139 VEC3_INLINE
Vec3 Vec3::operator/(
double s)
const
141 return Vec3(data[0]/s,data[1]/s,data[2]/s) ;
146 return Vec3(data[0]+s, data[1]+s, data[2]+s) ;
151 return Vec3(data[0]-s, data[1]-s, data[2]-s);
154 VEC3_INLINE
Vec3 Vec3::rotate(
const Vec3 &axis,
const Vec3 &axisPt)
const
156 const double phi = axis.norm();
159 const Vec3 r = *
this - axisPt;
160 const Vec3 n = axis/phi;
161 const double cosPhi = cos(phi);
162 const Vec3 rotatedR =
163 r*cosPhi + n*((dot(n, r))*(1-cosPhi)) + cross(r, n)*sin(phi);
164 return rotatedR + axisPt;
169 VEC3_INLINE
Vec3 &Vec3::operator+=(
double s)
177 VEC3_INLINE
Vec3 &Vec3::operator-=(
double s)
189 return Vec3(lhs.data[1]*rhs.data[2]-lhs.data[2]*rhs.data[1],
190 lhs.data[2]*rhs.data[0]-lhs.data[0]*rhs.data[2],
191 lhs.data[0]*rhs.data[1]-lhs.data[1]*rhs.data[0]);
196 VEC3_INLINE
double dot(
const Vec3& v1,
const Vec3& v2)
198 return v1.data[0] * v2.data[0] +
199 v1.data[1] * v2.data[1] +
200 v1.data[2] * v2.data[2];
203 VEC3_INLINE
Vec3 operator*(
double f,
const Vec3& rhs)
205 return Vec3(f*rhs.data[0], f*rhs.data[1], f*rhs.data[2]);
213 return sqrt(data[0]*data[0]+data[1]*data[1]+data[2]*data[2]);
218 VEC3_INLINE
double Vec3::norm2()
const
220 return data[0]*data[0]+data[1]*data[1]+data[2]*data[2];
225 VEC3_INLINE
Vec3 Vec3::unit()
const
227 return (*
this)/
norm();
234 res.data[0]=v1.data[0]>v2.data[0] ? v1.data[0] : v2.data[0];
235 res.data[1]=v1.data[1]>v2.data[1] ? v1.data[1] : v2.data[1];
236 res.data[2]=v1.data[2]>v2.data[2] ? v1.data[2] : v2.data[2];
243 res.data[0]=v1.data[0]<v2.data[0] ? v1.data[0] : v2.data[0];
244 res.data[1]=v1.data[1]<v2.data[1] ? v1.data[1] : v2.data[1];
245 res.data[2]=v1.data[2]<v2.data[2] ? v1.data[2] : v2.data[2];
250 VEC3_INLINE
Vec3 Vec3::unit_s()
const
253 if(n==0)
throw VecErr(
"norm() of data[2]ero-vector");
254 Vec3 res(data[0],data[1],data[2]);
258 VEC3_INLINE
double Vec3::max()
const
260 double m = ( data[0]>data[1] ? data[0] : data[1] );
262 return ( m>data[2] ? m : data[2] );
266 VEC3_INLINE
double Vec3::min()
const
268 double m = ( data[0]<data[1] ? data[0] : data[1] );
270 return ( m<data[2] ? m : data[2] );
273 VEC3_INLINE
bool Vec3::operator==(
const Vec3& V)
const
275 return((data[0]==V.data[0])&&(data[1]==V.data[1])&&(data[2]==V.data[2]));
278 VEC3_INLINE
bool Vec3::operator!=(
const Vec3& V)
const
280 return((data[0]!=V.data[0])||(data[1]!=V.data[1])||(data[2]!=V.data[2]));
285 VEC3_INLINE
Vec3 comp_max(
const Vec3& V1,
const Vec3& V2)
287 double x=(V1.X() > V2.X()) ? V1.X() : V2.X();
288 double y=(V1.Y() > V2.Y()) ? V1.Y() : V2.Y();
289 double z=(V1.Z() > V2.Z()) ? V1.Z() : V2.Z();
294 VEC3_INLINE
Vec3 comp_min(
const Vec3& V1,
const Vec3& V2)
296 double x=(V1.X() < V2.X()) ? V1.X() : V2.X();
297 double y=(V1.Y() < V2.Y()) ? V1.Y() : V2.Y();
298 double z=(V1.Z() < V2.Z()) ? V1.Z() : V2.Z();
305 VEC3_INLINE std::ostream& operator << (std::ostream& ostr,
const Vec3& V)
307 const char delimiter =
' ';
309 << V.data[0] << delimiter
310 << V.data[1] << delimiter
316 VEC3_INLINE std::istream& operator >> (std::istream& istr,
Vec3& V)