point_3d_h.hpp
1 #pragma once
2 
3 #include <cmath>
4 
5 #include "global.hpp"
6 
7 #include "angle.hpp"
8 #include "point_3d.hpp"
9 
10 namespace Cvb
11 {
12 
13 CVB_BEGIN_INLINE_NS
14 
15 #pragma pack ( push, 4 )
16 
18 
20 template< class T, class ENABLE = void>
21 class Point3DH final
22 {
23 
24 #ifndef CVB_DOXYGEN
25  static_assert (std::is_arithmetic<T>::value, "CVB: Unsupported data type - must be arithmetic!");
26 };
27 
28 
29 template <class T>
30 class Point3DH<T,
31  typename EnableIfArithmetic<T>::type> final
32 {
33 
34 #endif
35 
36  public:
37 
38  using ValueType = T;
39 
41 
44  Point3DH() noexcept = default;
45 
46 
48 
54  Point3DH(T x, T y, T z) noexcept
55  : x_(x)
56  , y_(y)
57  , z_(z)
58  {
59  }
60 
62 
69  Point3DH(T x, T y, T z, T w) noexcept
70  : x_(x)
71  , y_(y)
72  , z_(z)
73  , w_(w)
74  {
75  }
76 
77 
79 
83  Point3DH(Point3D<T> point3d) noexcept
84  : Point3DH(point3d.X(), point3d.Y(), point3d.Z())
85  {
86  }
87 
89 
93  template<std::size_t N>
94  Point3DH(const T(&list)[N]) noexcept
95  {
96  static_assert(N == 4, "CVB: Point3DH must have 4 elements");
97  std::copy(std::begin(list), std::end(list), &x_);
98  }
99 
100 
101 
103 
107  T X() const noexcept
108  {
109  return x_;
110  }
111 
113 
117  void SetX(T x) noexcept
118  {
119  x_ = x;
120  }
121 
123 
127  T Y() const noexcept
128  {
129  return y_;
130  }
131 
133 
137  void SetY(T y)
138  {
139  y_ = y;
140  }
141 
143 
147  T Z() const noexcept
148  {
149  return z_;
150  }
151 
153 
157  void SetZ(T z)
158  {
159  z_ = z;
160  }
161 
163 
167  T W() const noexcept
168  {
169  return w_;
170  }
171 
173 
177  void SetW(T w)
178  {
179  w_ = w;
180  }
181 
182 
184 
189  void Normalize() noexcept
190  {
191  x_ /= w_;
192  y_ /= w_;
193  z_ /= w_;
194  w_ = 1.0;
195  }
196 
197 
199 
204  bool operator==(const Point3DH<T>& other) const noexcept
205  {
206  return (x_ == other.x_ && y_ == other.y_ && z_ == other.z_ && w_ == other.w_);
207  }
208 
209 
211 
216  bool operator!=(const Point3DH<T>& other) const noexcept
217  {
218  return !(*this == other);
219  }
220 
222  template <class C>
223  explicit operator Point3DH<C>() const noexcept
224  {
225  static_assert(std::is_floating_point<C>::value, "CVB: Unsupported data type - must be floating point!");
226  return Point3DH<C>(static_cast<C>(X()), static_cast<C>(Y()), static_cast<C>(Z()), static_cast<C>(W()));
227  }
228 
230 
235  Point3DH<T>& operator +=(const Point3DH<T> & point) noexcept
236  {
237  x_ += point.x_;
238  y_ += point.y_;
239  z_ += point.z_;
240  w_ += point.w_;
241  return *this;
242  }
243 
245 
250  Point3DH<T>& operator -=(const Point3DH<T> & point) noexcept
251  {
252  x_ -= point.x_;
253  y_ -= point.y_;
254  z_ -= point.z_;
255  w_ -= point.w_;
256  return *this;
257  }
258 
260 
265  Point3DH<T>& operator *=(const T & value) noexcept
266  {
267  x_ *= value;
268  y_ *= value;
269  z_ *= value;
270  w_ *= value;
271  return *this;
272  }
273 
275 
280  Point3DH<T>& operator /=(const T & value) noexcept
281  {
282  x_ /= value;
283  y_ /= value;
284  z_ /= value;
285  w_ /= value;
286  return *this;
287  }
288 
289 
291 
296  const T& operator[](int index) const noexcept
297  {
298  assert(index < 4 && index >= 0);
299  return *(&x_ + index);
300  }
301 
303 
308  T& operator[](int index) noexcept
309  {
310  assert(index < 4 && index >= 0);
311  return *(&x_ + index);
312  }
313 
314  private:
315 
316  T x_ = static_cast<T>(0.0);
317  T y_ = static_cast<T>(0.0);
318  T z_ = static_cast<T>(0.0);
319  T w_ = static_cast<T>(1.0);
320 
321 
322 };
323 
325 
333 template <class T>
334 inline Point3DH<T> operator+(const Point3DH<T> & lhs, const Point3DH<T> & rhs)
335 {
336  return Point3DH<T>(lhs.X() + rhs.X(), lhs.Y() + rhs.Y(), lhs.Z() + rhs.Z(), lhs.W() + rhs.W());
337 }
338 
340 
348 template <class T>
349 inline Point3DH<T> operator-(const Point3DH<T> & lhs, const Point3DH<T> & rhs)
350 {
351  return Point3DH<T>(lhs.X() - rhs.X(), lhs.Y() - rhs.Y(), lhs.Z() - rhs.Z(), lhs.W() - rhs.W());
352 }
353 
355 
363 template <class T>
364 inline T operator*(const Point3DH<T> & lhs, const Point3DH<T> & rhs)
365 {
366  return lhs.X() * rhs.X() + lhs.Y() * rhs.Y() + lhs.Z() * rhs.Z() + lhs.W() * rhs.W();
367 }
368 
370 
378 template <class T>
379 inline Point3DH<T> operator*(const Point3DH<T> & lhs, const T & rhs)
380 {
381  return Point3DH<T>(lhs.X() * rhs, lhs.Y() * rhs, lhs.Z() * rhs, lhs.W() * rhs);
382 }
383 
385 
393 template <class T>
394 inline Point3DH<T> operator*(const T & lhs, const Point3DH<T> & rhs)
395 {
396  return rhs * lhs;
397 }
398 
400 
408 template <class T>
409 inline Point3DH<T> operator/(const Point3DH<T> & lhs, const T & rhs)
410 {
411  return Point3DH<T>(lhs.X() / rhs, lhs.Y() / rhs, lhs.Z() / rhs, lhs.W() / rhs);
412 }
413 
414 
416 template<class T>
418 
419 #pragma pack ( pop )
420 
421 
422 CVB_END_INLINE_NS
423 
424 
425 }
const T & operator[](int index) const noexcept
Index based element access.
Definition: point_3d_h.hpp:296
bool operator!=(const Point3DH< T > &other) const noexcept
Compares to an other point.
Definition: point_3d_h.hpp:216
Point3DH(const T(&list)[N]) noexcept
Construct a point with an initializer list.
Definition: point_3d_h.hpp:94
Point3DH() noexcept=default
Creates a default point at (0, 0).
Point3DH< T > & operator/=(const T &value) noexcept
Divide by a scalar and assigns to this point.
Definition: point_3d_h.hpp:280
T & operator[](int index) noexcept
Index based element access.
Definition: point_3d_h.hpp:308
Point3DH< T > & operator *=(const T &value) noexcept
Multiplies by a scalar and assigns to this point.
Definition: point_3d_h.hpp:265
bool operator==(const Point3DH< T > &other) const noexcept
Compares to an other point.
Definition: point_3d_h.hpp:204
T W() const noexcept
Gets the w-component of the point.
Definition: point_3d_h.hpp:167
AffineMatrix2D operator/(const AffineMatrix2D &lhs, const double &rhs)
Divide affine matrix by scalar.
Definition: affine_matrix_2d.hpp:301
Root namespace for the Image Manager interface.
Definition: version.hpp:11
void Normalize() noexcept
Normalize the x-, y-, and z- with the w-component.
Definition: point_3d_h.hpp:189
Point3DH< T > & operator -=(const Point3DH< T > &point) noexcept
Subtracts and assigns to this point.
Definition: point_3d_h.hpp:250
void SetY(T y)
Sets the y-component of the point.
Definition: point_3d_h.hpp:137
T X() const noexcept
Gets the x-component of the point.
Definition: point_3d_h.hpp:107
void SetX(T x) noexcept
Sets the x-component of the point.
Definition: point_3d_h.hpp:117
Multi-purpose 3D vector class.
Definition: point_3d.hpp:21
Point3DH(Point3D< T > point3d) noexcept
Create a homogeneous point from a point.
Definition: point_3d_h.hpp:83
AffineMatrix2D operator *(const AffineMatrix2D &lhs, const AffineMatrix2D &rhs) noexcept
Multiply two affine matrices.
Definition: affine_matrix_2d.hpp:245
Point3DH< T > operator+(const Point3DH< T > &lhs, const Point3DH< T > &rhs)
Add two points.
Definition: point_3d_h.hpp:334
void SetW(T w)
Sets the w-component of the point.
Definition: point_3d_h.hpp:177
T Y() const noexcept
Gets the y-component of the point.
Definition: point_3d_h.hpp:127
Point3DH(T x, T y, T z, T w) noexcept
Create a point from the x-, y-, z- and w-component.
Definition: point_3d_h.hpp:69
Point3DH< T > & operator+=(const Point3DH< T > &point) noexcept
Adds and assigns to this point.
Definition: point_3d_h.hpp:235
Multi-purpose 3D vector class (homogeneous).
Definition: point_3d_h.hpp:21
AffineMatrix2D operator-(const AffineMatrix2D &lhs, const AffineMatrix2D &rhs) noexcept
Subtract two affine matrices.
Definition: affine_matrix_2d.hpp:231
T Z() const noexcept
Gets the z-component of the point.
Definition: point_3d_h.hpp:147
void SetZ(T z)
Sets the z-component of the point.
Definition: point_3d_h.hpp:157