g4tools  5.4.0
vec3
Go to the documentation of this file.
1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
2 // See the file tools.license for terms.
3 
4 #ifndef tools_vec3
5 #define tools_vec3
6 
7 #include <cstddef> //size_t
8 
9 #ifdef TOOLS_MEM
10 #include "../mem"
11 #endif
12 
13 namespace tools {
14 
15 template <class T>
16 class vec3 {
17 #ifdef TOOLS_MEM
18  static const std::string& s_class() {
19  static const std::string s_v("tools::vec3");
20  return s_v;
21  }
22 #endif
23 public:
24  typedef T elem_t;
25  unsigned int dimension() const {return 3;}
26 public:
27  vec3(){
28 #ifdef TOOLS_MEM
29  mem::increment(s_class().c_str());
30 #endif
31  m_data[0] = T();
32  m_data[1] = T();
33  m_data[2] = T();
34  }
35  vec3(const T a_vec[3]) {
36 #ifdef TOOLS_MEM
37  mem::increment(s_class().c_str());
38 #endif
39  m_data[0] = a_vec[0];
40  m_data[1] = a_vec[1];
41  m_data[2] = a_vec[2];
42  }
43  vec3(const T& a0,const T& a1,const T& a2
44 #ifdef TOOLS_MEM
45  ,bool a_inc = true
46 #endif
47  ) {
48 #ifdef TOOLS_MEM
49  if(a_inc) mem::increment(s_class().c_str());
50 #endif
51  m_data[0] = a0;
52  m_data[1] = a1;
53  m_data[2] = a2;
54  }
55  virtual ~vec3() {
56 #ifdef TOOLS_MEM
57  mem::decrement(s_class().c_str());
58 #endif
59  }
60 public:
61  vec3(const vec3& a_from){
62 #ifdef TOOLS_MEM
63  mem::increment(s_class().c_str());
64 #endif
65  m_data[0] = a_from.m_data[0];
66  m_data[1] = a_from.m_data[1];
67  m_data[2] = a_from.m_data[2];
68  }
69  vec3& operator=(const vec3& a_from) {
70  m_data[0] = a_from.m_data[0];
71  m_data[1] = a_from.m_data[1];
72  m_data[2] = a_from.m_data[2];
73  return *this;
74  }
75 public:
76  const T& v0() const { return m_data[0];}
77  const T& v1() const { return m_data[1];}
78  const T& v2() const { return m_data[2];}
79 
80  void v0(const T& a_value) { m_data[0] = a_value;}
81  void v1(const T& a_value) { m_data[1] = a_value;}
82  void v2(const T& a_value) { m_data[2] = a_value;}
83 
84  const T& x() const {return m_data[0];}
85  const T& y() const {return m_data[1];}
86  const T& z() const {return m_data[2];}
87 
88  T& x() {return m_data[0];}
89  T& y() {return m_data[1];}
90  T& z() {return m_data[2];}
91 
92  void set_value(const T& a0,const T& a1,const T& a2) {
93  m_data[0] = a0;
94  m_data[1] = a1;
95  m_data[2] = a2;
96  }
97  void set_value(const T aV[3]) {
98  m_data[0] = aV[0];
99  m_data[1] = aV[1];
100  m_data[2] = aV[2];
101  }
102  void value(T& a0,T& a1,T& a2) const {
103  a0 = m_data[0];
104  a1 = m_data[1];
105  a2 = m_data[2];
106  }
107 
108  //bool set_value(unsigned int a_index,const T& a_value) {
109  // if(a_index>=3) return false;
110  // m_[a_index] = a_value;
111  // return true;
112  //}
113 
114  T length(T(*a_sqrt)(T)) const {
115  return a_sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]+m_data[2]*m_data[2]);
116  }
117 
118  T normalize(T(*a_sqrt)(T)) {
119  T norme = length(a_sqrt);
120  if(norme==T()) return T();
121  divide(norme);
122  return norme;
123  }
124 
125  T dot(const vec3& aV) const {
126  return (m_data[0] * aV.m_data[0] +
127  m_data[1] * aV.m_data[1] +
128  m_data[2] * aV.m_data[2]);
129  }
130 
131  void cross(const vec3<T>& aV,vec3<T>& a_value) const {
132  a_value.set_value(m_data[1] * aV.m_data[2] - m_data[2] * aV.m_data[1],
133  m_data[2] * aV.m_data[0] - m_data[0] * aV.m_data[2],
134  m_data[0] * aV.m_data[1] - m_data[1] * aV.m_data[0]);
135  }
136 
137  bool equal(const vec3& aV) const {
138  if(m_data[0]!=aV.m_data[0]) return false;
139  if(m_data[1]!=aV.m_data[1]) return false;
140  if(m_data[2]!=aV.m_data[2]) return false;
141  return true;
142  }
143 
144  template <class PREC>
145  bool equal_prec(const vec3& a_v,PREC a_prec,PREC(*a_fabs)(const T&)) const {
146  if(&a_v==this) return true;
147  for(unsigned int index=0;index<3;index++) {
148  T diff = m_data[index]-a_v.m_data[index];
149  if(a_fabs(diff)>=a_prec) return false;
150  }
151  return true;
152  }
153 
154  vec3<T> _cross(const vec3<T>& aV) const {
155  //not effective.
156  return vec3<T>(m_data[1] * aV.m_data[2] - m_data[2] * aV.m_data[1],
157  m_data[2] * aV.m_data[0] - m_data[0] * aV.m_data[2],
158  m_data[0] * aV.m_data[1] - m_data[1] * aV.m_data[0]);
159  }
160 
161  bool divide(const T& a_T) {
162  if(a_T==T()) return false;
163  m_data[0] /= a_T;
164  m_data[1] /= a_T;
165  m_data[2] /= a_T;
166  return true;
167  }
168 
169  void multiply(const T& a_T) {
170  m_data[0] *= a_T;
171  m_data[1] *= a_T;
172  m_data[2] *= a_T;
173  }
174 
175  void add(const vec3& a_v) {
176  m_data[0] += a_v.m_data[0];
177  m_data[1] += a_v.m_data[1];
178  m_data[2] += a_v.m_data[2];
179  }
180 
181  void add(const T& a0,const T& a1,const T& a2) {
182  m_data[0] += a0;
183  m_data[1] += a1;
184  m_data[2] += a2;
185  }
186 
187  void subtract(const vec3& a_v) {
188  m_data[0] -= a_v.m_data[0];
189  m_data[1] -= a_v.m_data[1];
190  m_data[2] -= a_v.m_data[2];
191  }
192 
193  void subtract(const T& a0,const T& a1,const T& a2) {
194  m_data[0] -= a0;
195  m_data[1] -= a1;
196  m_data[2] -= a2;
197  }
198 
199  bool cos_angle(const vec3& a_v,T& a_cos,T(*a_sqrt)(T)) const {
200  //WARNING : if ret false, a_cos is not set.
201  T this_length = length(a_sqrt);
202  if(this_length==T()) return false;
203  T a_v_length = a_v.length(a_sqrt);
204  if(a_v_length==T()) return false;
205  a_cos = dot(a_v)/(this_length*a_v_length);
206  return true;
207  }
208 
209  bool theta_phi(T& a_theta,T& a_phi,T(*a_sqrt)(T),T(*a_atan2)(T,T)) const {
210  //WARNING : if ret false, a_theta, a_phi are not set.
211  if(length(a_sqrt)==T()) return false;
212  a_phi = a_atan2(m_data[1],m_data[0]);
213  T xy = a_sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1]);
214  a_theta = a_atan2(xy,m_data[2]);
215  return true;
216  }
217 
218 public: //operators
219  T& operator[](size_t a_index) {
220  //WARNING : no check on a_index.
221  return m_data[a_index];
222  }
223  const T& operator[](size_t a_index) const {
224  //WARNING : no check on a_index.
225  return m_data[a_index];
226  }
227 
228  vec3& operator*=(const T& a_v) {
229  m_data[0] *= a_v;
230  m_data[1] *= a_v;
231  m_data[2] *= a_v;
232  return *this;
233  }
234 
235  vec3 operator+(const vec3& a_v) const {
236  return vec3(m_data[0]+a_v.m_data[0],
237  m_data[1]+a_v.m_data[1],
238  m_data[2]+a_v.m_data[2]);
239  }
240 
241  vec3 operator-(const vec3& a_v) const {
242  return vec3(m_data[0]-a_v.m_data[0],
243  m_data[1]-a_v.m_data[1],
244  m_data[2]-a_v.m_data[2]);
245  }
246 
247  vec3 operator*(const T& a_v) const {
248  return vec3(m_data[0]*a_v,
249  m_data[1]*a_v,
250  m_data[2]*a_v);
251  }
252 
253  vec3 operator/(const T& a_v) const {
254  if(a_v==T()) return vec3();
255  return vec3(m_data[0]/a_v,
256  m_data[1]/a_v,
257  m_data[2]/a_v);
258  }
259 
260  bool operator==(const vec3& a_v) const {return equal(a_v);}
261  bool operator!=(const vec3& a_v) const {return !operator==(a_v);}
262 
263 public: //for inlib/sg/sf_vec
264  typedef unsigned int size_type;
265  size_type size() const {return 3;}
266  const T* data() const {return m_data;}
267  size_type data_size() const {return 3;} //for eqT.
268 public: //for iv2sg
269  const T* getValue() const {return m_data;}
270  void setValue(const T& a0,const T& a1,const T& a2) {
271  m_data[0] = a0;
272  m_data[1] = a1;
273  m_data[2] = a2;
274  }
275  void getValue(T& a0,T& a1,T& a2) const {
276  a0 = m_data[0];
277  a1 = m_data[1];
278  a2 = m_data[2];
279  }
280  void setValue(const vec3& a_v) {
281  m_data[0] = a_v.m_data[0];
282  m_data[1] = a_v.m_data[1];
283  m_data[2] = a_v.m_data[2];
284  }
285  void setValue(const T aV[3]) {
286  m_data[0] = aV[0];
287  m_data[1] = aV[1];
288  m_data[2] = aV[2];
289  }
290 
291  vec3& setValue(const vec3& a_bary,
292  const vec3& a_v0,const vec3& a_v1,const vec3& a_v2) {
293  m_data[0] = a_bary[0]*a_v0[0]+a_bary[1]*a_v1[0]+a_bary[2]*a_v2[0];
294  m_data[1] = a_bary[0]*a_v0[1]+a_bary[1]*a_v1[1]+a_bary[2]*a_v2[1];
295  m_data[2] = a_bary[0]*a_v0[2]+a_bary[1]*a_v1[2]+a_bary[2]*a_v2[2];
296  return *this;
297  }
298 
299 public:
300 #if defined(TOOLS_MEM) && !defined(TOOLS_MEM_ATEXIT)
301  static const vec3<T>& s_x() {static const vec3<T> s_v(1,0,0,false);return s_v;}
302  static const vec3<T>& s_y() {static const vec3<T> s_v(0,1,0,false);return s_v;}
303  static const vec3<T>& s_z() {static const vec3<T> s_v(0,0,1,false);return s_v;}
304 #else
305  static const vec3<T>& s_x() {static const vec3<T> s_v(1,0,0);return s_v;}
306  static const vec3<T>& s_y() {static const vec3<T> s_v(0,1,0);return s_v;}
307  static const vec3<T>& s_z() {static const vec3<T> s_v(0,0,1);return s_v;}
308 #endif
309 protected:
310  T m_data[3];
311 
312 private:static void check_instantiation() {vec3<float> v;}
313 };
314 
315 //for sf, mf :
316 template <class T>
317 inline const T* get_data(const vec3<T>& a_v) {return a_v.data();}
318 
319 template <class T>
320 inline void get_normal(const vec3<T>& a_p0,const vec3<T>& a_p1,const vec3<T>& a_p2,vec3<T>& a_nm,
321  vec3<T>& a_tmp_1,vec3<T>& a_tmp_2,T(*a_sqrt)(T)) {
322  // Used to optimize sg::bin().
323  //(a_p1-a_p0).cross(a_p2-a_p1,a_nm);
324 
325  a_tmp_1 = a_p1;
326  a_tmp_1.subtract(a_p0);
327 
328  a_tmp_2 = a_p2;
329  a_tmp_2.subtract(a_p1);
330 
331  a_tmp_1.cross(a_tmp_2,a_nm);
332 
333  a_nm.normalize(a_sqrt);
334 }
335 
336 /*
337 template <class VEC3>
338 inline void get_normal(const VEC3& a_p0,const VEC3& a_p1,const VEC3& a_p2,VEC3& a_nm) {
339  VEC3 tmp1,tmp2;
340  get_normal(a_p0,a_p1,a_p2,a_nm,tmp1,tmp2);
341 }
342 */
343 template <class VEC3>
344 inline void direction(const VEC3& a_p0,const VEC3& a_p1,const VEC3& a_p2,VEC3& a_value) {
345  // Orientation is computed by taking (p1 - p0) x (p2 - p0)
346  VEC3 P = a_p1;
347  P.subtract(a_p0);
348  VEC3 P2 = a_p2;
349  P2.subtract(a_p0);
350  P.cross(P2,a_value);
351 }
352 
353 template <class VEC3>
354 inline void area(const VEC3& a_p0,const VEC3& a_p1,const VEC3& a_p2,typename VEC3::elem_t& a_value,
355  VEC3& a_tmp_1,VEC3& a_tmp_2,VEC3& a_tmp_3) {
356  // area of the triangle (a_p0,a_p1,a_p2)
357  typedef typename VEC3::elem_t T;
358 
359  a_tmp_1 = a_p1;
360  a_tmp_1.subtract(a_p0);
361 
362  a_tmp_2 = a_p2;
363  a_tmp_2.subtract(a_p1);
364 
365  a_tmp_1.cross(a_tmp_2,a_tmp_3);
366 
367  a_value = a_tmp_3.length()/T(2);
368 }
369 
370 template <class VEC3>
371 inline void area(const VEC3& a_p0,const VEC3& a_p1,const VEC3& a_p2,typename VEC3::elem_t& a_value) {
372  VEC3 tmp1,tmp2,tmp3;
373  area(a_p0,a_p1,a_p2,a_value,tmp1,tmp2,tmp3);
374 }
375 
376 template <class T>
377 inline void direction(const T& a_0_x,const T& a_0_y,const T& a_0_z,
378  const T& a_1_x,const T& a_1_y,const T& a_1_z,
379  const T& a_2_x,const T& a_2_y,const T& a_2_z,vec3<T>& a_value) {
380  direction(vec3<T>(a_0_x,a_0_y,a_0_z),
381  vec3<T>(a_1_x,a_1_y,a_1_z),
382  vec3<T>(a_2_x,a_2_y,a_2_z),a_value);
383 }
384 
385 }
386 
387 #include <ostream>
388 
389 namespace tools {
390 
391 // for sf_vec::dump().
392 template <class T>
393 inline std::ostream& operator<<(std::ostream& a_out,const vec3<T>& a_this){
394  a_out << "x = " << a_this.v0()
395  << ",y = " << a_this.v1()
396  << ",z = " << a_this.v2();
397  return a_out;
398 }
399 
400 }
401 
402 #endif
tools::vec3::v2
const T & v2() const
Definition: vec3:78
tools::vec3::z
T & z()
Definition: vec3:90
tools::direction
void direction(const VEC3 &a_p0, const VEC3 &a_p1, const VEC3 &a_p2, VEC3 &a_value)
Definition: vec3:344
tools::vec3::vec3
vec3(const T &a0, const T &a1, const T &a2)
Definition: vec3:43
tools::vec3::elem_t
T elem_t
Definition: vec3:24
tools::vec3::data_size
size_type data_size() const
Definition: vec3:267
tools::vec3::x
T & x()
Definition: vec3:88
tools::area
void area(const VEC3 &a_p0, const VEC3 &a_p1, const VEC3 &a_p2, typename VEC3::elem_t &a_value, VEC3 &a_tmp_1, VEC3 &a_tmp_2, VEC3 &a_tmp_3)
Definition: vec3:354
tools::vec3::normalize
T normalize(T(*a_sqrt)(T))
Definition: vec3:118
tools::vec3
Definition: vec3:16
tools::vec3::v1
const T & v1() const
Definition: vec3:77
tools::vec3::y
T & y()
Definition: vec3:89
tools::vec3::equal_prec
bool equal_prec(const vec3 &a_v, PREC a_prec, PREC(*a_fabs)(const T &)) const
Definition: vec3:145
tools::vec3::operator[]
const T & operator[](size_t a_index) const
Definition: vec3:223
tools::vec3::operator[]
T & operator[](size_t a_index)
Definition: vec3:219
tools::vec3::set_value
void set_value(const T &a0, const T &a1, const T &a2)
Definition: vec3:92
tools::vec3::s_z
static const vec3< T > & s_z()
Definition: vec3:307
tools::vec3::size
size_type size() const
Definition: vec3:265
tools::vec3::theta_phi
bool theta_phi(T &a_theta, T &a_phi, T(*a_sqrt)(T), T(*a_atan2)(T, T)) const
Definition: vec3:209
tools::vec3::multiply
void multiply(const T &a_T)
Definition: vec3:169
tools::vec3::v0
const T & v0() const
Definition: vec3:76
tools::vec3::v2
void v2(const T &a_value)
Definition: vec3:82
tools::vec3::size_type
unsigned int size_type
Definition: vec3:264
tools::get_data
const T * get_data(const mat4< T > &a_v)
Definition: mat4:494
tools::vec3::add
void add(const T &a0, const T &a1, const T &a2)
Definition: vec3:181
tools::vec3::setValue
void setValue(const vec3 &a_v)
Definition: vec3:280
tools::vec3::setValue
vec3 & setValue(const vec3 &a_bary, const vec3 &a_v0, const vec3 &a_v1, const vec3 &a_v2)
Definition: vec3:291
tools::vec3::~vec3
virtual ~vec3()
Definition: vec3:55
tools::vec3::length
T length(T(*a_sqrt)(T)) const
Definition: vec3:114
tools::vec3::operator!=
bool operator!=(const vec3 &a_v) const
Definition: vec3:261
tools::vec3::y
const T & y() const
Definition: vec3:85
tools::vec3::value
void value(T &a0, T &a1, T &a2) const
Definition: vec3:102
tools::vec3::setValue
void setValue(const T &a0, const T &a1, const T &a2)
Definition: vec3:270
tools::vec3::x
const T & x() const
Definition: vec3:84
tools::vec3::s_y
static const vec3< T > & s_y()
Definition: vec3:306
tools::vec3::vec3
vec3()
Definition: vec3:27
tools::vec3::divide
bool divide(const T &a_T)
Definition: vec3:161
tools::vec3::cos_angle
bool cos_angle(const vec3 &a_v, T &a_cos, T(*a_sqrt)(T)) const
Definition: vec3:199
tools::vec3::setValue
void setValue(const T aV[3])
Definition: vec3:285
tools::vec3::dimension
unsigned int dimension() const
Definition: vec3:25
tools::vec3::vec3
vec3(const vec3 &a_from)
Definition: vec3:61
tools::vec3::add
void add(const vec3 &a_v)
Definition: vec3:175
tools::vec3::subtract
void subtract(const vec3 &a_v)
Definition: vec3:187
tools::vec3::getValue
const T * getValue() const
Definition: vec3:269
tools::vec3::operator+
vec3 operator+(const vec3 &a_v) const
Definition: vec3:235
tools::vec3::cross
void cross(const vec3< T > &aV, vec3< T > &a_value) const
Definition: vec3:131
tools::vec3::operator=
vec3 & operator=(const vec3 &a_from)
Definition: vec3:69
tools::vec3::operator==
bool operator==(const vec3 &a_v) const
Definition: vec3:260
tools
inlined C code : ///////////////////////////////////
Definition: aida_ntuple:26
tools::get_normal
void get_normal(const vec3< T > &a_p0, const vec3< T > &a_p1, const vec3< T > &a_p2, vec3< T > &a_nm, vec3< T > &a_tmp_1, vec3< T > &a_tmp_2, T(*a_sqrt)(T))
Definition: vec3:320
tools::vec3::v1
void v1(const T &a_value)
Definition: vec3:81
tools::vec3::s_x
static const vec3< T > & s_x()
Definition: vec3:305
tools::diff
void diff(std::ostream &a_out, const array< T > &aA, const array< T > &aB, T a_epsilon)
Definition: array:529
tools::vec3::operator/
vec3 operator/(const T &a_v) const
Definition: vec3:253
tools::vec3::operator*
vec3 operator*(const T &a_v) const
Definition: vec3:247
tools::vec3::set_value
void set_value(const T aV[3])
Definition: vec3:97
tools::vec3::data
const T * data() const
Definition: vec3:266
tools::operator<<
std::ostream & operator<<(std::ostream &a_out, const mat3< T > &a_mtx)
Definition: mat3:226
tools::vec3::z
const T & z() const
Definition: vec3:86
tools::vec3::equal
bool equal(const vec3 &aV) const
Definition: vec3:137
tools::vec3::m_data
T m_data[3]
Definition: vec3:310
tools::vec3::operator-
vec3 operator-(const vec3 &a_v) const
Definition: vec3:241
tools::vec3::operator*=
vec3 & operator*=(const T &a_v)
Definition: vec3:228
tools::vec3::subtract
void subtract(const T &a0, const T &a1, const T &a2)
Definition: vec3:193
tools::vec3::vec3
vec3(const T a_vec[3])
Definition: vec3:35
tools::vec3::_cross
vec3< T > _cross(const vec3< T > &aV) const
Definition: vec3:154
tools::vec3::v0
void v0(const T &a_value)
Definition: vec3:80
tools::vec3::getValue
void getValue(T &a0, T &a1, T &a2) const
Definition: vec3:275
tools::vec3::dot
T dot(const vec3 &aV) const
Definition: vec3:125