fw4spl
Vector.hxx
1 /* ***** BEGIN LICENSE BLOCK *****
2  * FW4SPL - Copyright (C) IRCAD, 2009-2016.
3  * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
4  * published by the Free Software Foundation.
5  * ****** END LICENSE BLOCK ****** */
6 
7 #ifndef __FWDATATOOLS_VECTOR_HXX__
8 #define __FWDATATOOLS_VECTOR_HXX__
9 
10 #include <fwCore/base.hpp>
11 
12 #include <cmath>
13 
14 namespace fwDataTools
15 {
16 
17 class Point
18 {
19 public:
20 
21  float x;
22  float y;
23  float z;
24 
25  Point() : x(0.), y(0.), z(0.)
26  {
27  }
28  Point(const float p[3]) : x(p[0]), y(p[1]), z(p[2])
29  {
30  }
31 
32  Point(float _x, float _y, float _z) : x(_x), y(_y), z(_z)
33  {
34  }
35 
36  bool operator<(const Point& pt) const
37  {
38  return ( this->x < pt.x
39  ||(this->x == pt.x && this->y < pt.y)
40  ||(this->x == pt.x && this->y == pt.y && this->z < pt.z) );
41  }
42 };
43 
44 template <typename T>
45 class Vector
46 {
47 public:
48 
49  T x;
50  T y;
51  T z;
52 
53  Vector() : x(0.), y(0.), z(0.)
54  {
55  }
56 
57  Vector(const Vector& v) : x(v.x), y(v.y), z(v.z)
58  {
59  }
60  Vector(const Point& p1, const Point& p2) : x(p2.x-p1.x), y(p2.y-p1.y), z(p2.z-p1.z)
61  {
62  }
63  Vector(T _x, T _y, T _z) : x(_x), y(_y), z(_z)
64  {
65  }
66 
67 
68  bool operator<(const Vector& v) const
69  {
70  return ( x < v.x
71  ||(x == v.x && y < v.y)
72  ||(x == v.x && y == v.y && z < v.z) );
73  }
74 
75  void operator=(const Vector& v)
76  {
77  x = v.x; y = v.y; z = v.z;
78  }
79 
80  void operator-=(const Vector& v)
81  {
82  x -= v.x; y -= v.y; z -= v.z;
83  }
84 
85  void operator+=(const Vector& v)
86  {
87  x += v.x; y += v.y; z += v.z;
88  }
89 
90  void operator*=(const float val)
91  {
92  x = val*x; y = val*y; z = val*z;
93  }
94 
95  void operator/=(const float val)
96  {
97  x = x/val; y = y/val; z = z/val;
98  }
99 
100  T norm2()
101  {
102  return x*x + y*y + z*z;
103  }
104 
105  T norm()
106  {
107  return std::sqrt(this->norm2());
108  }
109 
110  void normalize()
111  {
112  T norm = this->norm();
113  *this /= (norm == 0) ? 1 : norm;
114  }
115 
116  Vector normalized()
117  {
118  Vector v(*this);
119  v.normalize();
120  return v;
121  }
122 
123  T dot(Vector& v)
124  {
125  return x*v.x + y*v.y + z*v.z;
126  }
127 
128  void crossWith(const Vector& v)
129  {
130  T _x = y * v.z - z * v.y;
131  T _y = z * v.x - x * v.z;
132  T _z = x * v.y - y * v.x;
133  x = _x;
134  y = _y;
135  z = _z;
136  }
137 
138  Vector cross(const Vector& v)
139  {
140  Vector res(*this);
141  res.crossWith(v);
142  return res;
143  }
144 };
145 
146 } // namespace fwDataTools
147 
148 #endif // __FWDATATOOLS_VECTOR_HXX__
149 
The namespace fwDataTools contains classes which provide helpers to manipulate fwData::Object. *.