NRE_Vector3D.hpp
Go to the documentation of this file.
1 
10  #pragma once
11 
12  #include <Utility/String/NRE_String.hpp>
13  #include <Utility/Interfaces/Stringable/NRE_Stringable.hpp>
14  #include "../../NRE_Math.hpp"
15 
20  namespace NRE {
25  namespace Math {
26 
27  template<class> class Vector2D;
28  template<class> class Vector4D;
29 
34  template <class T>
35  class Vector3D : public Utility::Stringable<Vector3D<T>> {
36  static_assert(ArithmeticCheckerV<T>);
38  private : //Fields
39  T x = 0;
40  T y = 0;
41  T z = 0;
43  public : // Methods
44  //## Constructor ##//
48  constexpr Vector3D() = default;
55  template <class K, class L, class N, typename = UseIfArithmetic<K, L, N>>
56  constexpr Vector3D(K nX, L nY, N nZ) : x(static_cast <T> (nX)), y(static_cast <T> (nY)), z(static_cast <T> (nZ)) {
57  }
62  template <class K, typename = UseIfArithmetic<K>>
63  constexpr Vector3D(K value) : Vector3D(value, value, value) {
64  }
69  constexpr Vector3D(std::initializer_list<T> list);
70 
71  //## Copy-Constructor ##//
76  constexpr Vector3D(Vector3D const& u) = default;
77 
78  //## Move-Constructor ##//
83  constexpr Vector3D(Vector3D && u) = default;
84 
85  //## Convertor ##//
90  template <class K>
91  constexpr Vector3D(Vector3D<K> const& u);
96  template <class K>
97  constexpr Vector3D(Vector2D<K> const& u);
102  template <class K>
103  constexpr Vector3D(Vector4D<K> const& u);
109  template <class K, class L, typename = UseIfArithmetic<L>>
110  constexpr Vector3D(Vector2D<K> const& u, L nZ) : Vector3D(u.getX(), u.getY(), nZ) {
111  }
112 
113  //## Deconstructor ##//
117  ~Vector3D() = default;
118 
119  //## Getter ##//
123  constexpr T getX() const;
127  constexpr T getY() const;
131  constexpr T getZ() const;
135  constexpr T getR() const;
139  constexpr T getG() const;
143  constexpr T getB() const;
144 
145  //## Setter ##//
150  template <class K, typename = UseIfArithmetic<K>>
151  constexpr void setX(K nX) {
152  x = static_cast <T> (nX);
153  }
158  template <class K, typename = UseIfArithmetic<K>>
159  constexpr void setY(K nY) {
160  y = static_cast <T> (nY);
161  }
166  template <class K, typename = UseIfArithmetic<K>>
167  constexpr void setZ(K nZ) {
168  z = static_cast <T> (nZ);
169  }
174  template <class K, typename = UseIfArithmetic<K>>
175  constexpr void setR(K r) {
176  setX(r);
177  }
182  template <class K, typename = UseIfArithmetic<K>>
183  constexpr void setG(K g) {
184  setY(g);
185  }
190  template <class K, typename = UseIfArithmetic<K>>
191  constexpr void setB(K b) {
192  setZ(b);
193  }
200  template <class K, class L, class N, typename = UseIfArithmetic<K, L, N>>
201  constexpr void setCoord(K nX, L nY, N nZ) {
202  setX(nX);
203  setY(nY);
204  setZ(nZ);
205  }
211  template <class K, class L, typename = UseIfArithmetic<L>>
212  constexpr void setCoord(Vector2D<K> const& u, L nZ) {
213  setX(u.getX());
214  setY(u.getY());
215  setZ(nZ);
216  }
223  template <class K, class L, class N, typename = UseIfArithmetic<K, L, N>>
224  constexpr void setRGB(K r, L g, N b) {
225  setR(r);
226  setG(g);
227  setB(b);
228  }
229 
230  //## Methods ##//
234  long double norm() const;
238  constexpr T normSquared() const;
242  template <class K>
243  long double distance(Vector3D<K> const& v) const;
247  template <class K>
248  constexpr std::common_type_t<T, K> distanceSquared(Vector3D<K> const& v) const;
253  Vector3D& normalize();
258  template <class K, typename = UseIfArithmetic<K>>
259  void limit(K max) {
260  auto n = norm();
261  if (n > max) {
262  normalize();
263  }
264  }
270  template <class K, typename = UseIfArithmetic<K>>
271  Vector3D& pow(K p) {
272  setX(std::pow(static_cast <std::common_type_t<T, K>> (x), static_cast <std::common_type_t<T, K>> (p)));
273  setY(std::pow(static_cast <std::common_type_t<T, K>> (y), static_cast <std::common_type_t<T, K>> (p)));
274  setZ(std::pow(static_cast <std::common_type_t<T, K>> (z), static_cast <std::common_type_t<T, K>> (p)));
275  return *this;
276  }
282  template <class K>
283  Vector3D& pow(Vector3D<K> const& p);
287  constexpr const T* value() const;
288 
289  //## Access Operator ##//
296  constexpr T& operator [](std::size_t index);
303  constexpr T const& operator [](std::size_t index) const;
304 
305  //## Assignment Operator ##//
311  constexpr Vector3D& operator =(Vector3D const& u) = default;
317  constexpr Vector3D& operator =(Vector3D && u) = default;
323  template <class K>
324  constexpr Vector3D& operator =(Vector3D<K> const& u);
330  template <class K>
331  constexpr Vector3D& operator =(Vector3D<K> && u);
332 
333  //## Shortcut Operator ##//
339  template <class K, typename = UseIfArithmetic<K>>
340  constexpr Vector3D& operator +=(K k) {
341  setX(static_cast <std::common_type_t<T, K>> (x) + static_cast <std::common_type_t<T, K>> (k));
342  setY(static_cast <std::common_type_t<T, K>> (y) + static_cast <std::common_type_t<T, K>> (k));
343  setZ(static_cast <std::common_type_t<T, K>> (z) + static_cast <std::common_type_t<T, K>> (k));
344  return *this;
345  }
351  template <class K>
352  constexpr Vector3D& operator +=(Vector3D<K> const& u);
358  template <class K, typename = UseIfArithmetic<K>>
359  constexpr Vector3D& operator -=(K k) {
360  setX(static_cast <std::common_type_t<T, K>> (x) - static_cast <std::common_type_t<T, K>> (k));
361  setY(static_cast <std::common_type_t<T, K>> (y) - static_cast <std::common_type_t<T, K>> (k));
362  setZ(static_cast <std::common_type_t<T, K>> (z) - static_cast <std::common_type_t<T, K>> (k));
363  return *this;
364  }
370  template <class K>
371  constexpr Vector3D& operator -=(Vector3D<K> const& u);
377  template <class K, typename = UseIfArithmetic<K>>
378  constexpr Vector3D& operator *=(K k) {
379  setX(static_cast <std::common_type_t<T, K>> (x) * static_cast <std::common_type_t<T, K>> (k));
380  setY(static_cast <std::common_type_t<T, K>> (y) * static_cast <std::common_type_t<T, K>> (k));
381  setZ(static_cast <std::common_type_t<T, K>> (z) * static_cast <std::common_type_t<T, K>> (k));
382  return *this;
383  }
389  template <class K>
390  constexpr Vector3D& operator *=(Vector3D<K> const& u);
396  template <class K, typename = UseIfArithmetic<K>>
397  constexpr Vector3D& operator /=(K k) {
398  setX(static_cast <std::common_type_t<T, K>> (x) / static_cast <std::common_type_t<T, K>> (k));
399  setY(static_cast <std::common_type_t<T, K>> (y) / static_cast <std::common_type_t<T, K>> (k));
400  setZ(static_cast <std::common_type_t<T, K>> (z) / static_cast <std::common_type_t<T, K>> (k));
401  return *this;
402  }
408  template <class K>
409  constexpr Vector3D& operator /=(Vector3D<K> const& u);
415  template <class K>
416  constexpr std::common_type_t<T, K> operator |=(Vector3D<K> const& u) const;
422  template <class K>
423  constexpr Vector3D& operator ^=(Vector3D<K> const& u);
424 
425  //## Arithmetic Operator ##//
431  template <class K, typename = UseIfArithmetic<K>>
433  return Vector3D<std::common_type_t<T, K>>(*this) += k;
434  }
440  template <class K>
441  constexpr Vector3D<std::common_type_t<T, K>> operator +(Vector3D<K> const& u) const;
447  template <class K, typename = UseIfArithmetic<K>>
449  return Vector3D<std::common_type_t<T, K>>(*this) -= k;
450  }
456  template <class K>
457  constexpr Vector3D<std::common_type_t<T, K>> operator -(Vector3D<K> const& u) const;
462  constexpr Vector3D operator -() const;
468  template <class K, typename = UseIfArithmetic<K>>
470  return Vector3D<std::common_type_t<T, K>>(*this) *= k;
471  }
477  template <class K>
478  constexpr Vector3D<std::common_type_t<T, K>> operator *(Vector3D<K> const& u) const;
484  template <class K, typename = UseIfArithmetic<K>>
486  return Vector3D<std::common_type_t<T, K>>(*this) /= k;
487  }
493  template <class K>
494  constexpr Vector3D<std::common_type_t<T, K>> operator /(Vector3D<K> const& u) const;
500  template <class K>
501  constexpr std::common_type_t<T, K> operator |(Vector3D<K> const& u) const;
507  template <class K>
508  constexpr Vector3D<std::common_type_t<T, K>> operator ^(Vector3D<K> const& u) const;
509 
510  //## Comparison Operator ##//
516  template <class K>
517  constexpr bool operator ==(Vector3D<K> const& u) const;
523  template <class K>
524  constexpr bool operator !=(Vector3D<K> const& u) const;
530  template <class K>
531  constexpr bool operator <(Vector3D<K> const& u) const;
537  template <class K>
538  constexpr bool operator >(Vector3D<K> const& u) const;
544  template <class K>
545  constexpr bool operator <=(Vector3D<K> const& u) const;
551  template <class K>
552  constexpr bool operator >=(Vector3D<K> const& u) const;
553 
554  //## Stream Operator ##//
559  Utility::String toString() const;
560  };
561 
568  template <class T, class K, typename = UseIfArithmetic<K>>
570  return u * k;
571  }
577  template <class T>
585  template <class T, class K, typename = UseIfArithmetic<K>>
588  }
595  template <class T, class K>
603  template <class T, class K>
604  constexpr Vector3D<std::common_type_t<T, K>> reflect(Vector3D<T> const& u, Vector3D<K> const& n);
605 
606  template <class T>
607  using Point3D = Vector3D<T>;
608  }
609  }
610 
615  namespace std {
616  template <class T, class K>
617  struct common_type<NRE::Math::Vector3D<T>, NRE::Math::Vector3D<K>> {
619  };
624  template <>
625  class hash<NRE::Math::Vector3D<float>> {
626  public:
632  size_t operator()(NRE::Math::Vector3D<float> const& p) const {
633  static constexpr size_t keep = 21;
634  static constexpr size_t hashSize = sizeof(size_t) * 8;
635 
636  float x = p.getX();
637  float y = p.getY();
638  float z = p.getZ();
639 
640  size_t iX, iY, iZ;
641  memcpy(&iX, &x, sizeof(x));
642  iX <<= hashSize - keep;
643  iX &= 0xFFFFF80000000000;
644  memcpy(&iY, &y, sizeof(y));
645  iY <<= hashSize - (keep * 2);
646  iY &= 0x000007FFFFC00000;
647  memcpy(&iZ, &z, sizeof(z));
648  iZ <<= hashSize - (keep * 3);
649  iZ &= 0x00000000003FFFFE;
650  return iX + iY + iZ;
651  }
652  };
653  }
654 
655  #include "NRE_Vector3D.tpp"
constexpr Vector3D operator-() const
A cartesian 2D vector.
Definition: NRE_Matrix3x3.hpp:32
constexpr bool operator>(Vector3D< K > const &u) const
constexpr Vector3D< std::common_type_t< T, K > > operator^(Vector3D< K > const &u) const
constexpr bool operator!=(Vector3D< K > const &u) const
constexpr T getG() const
constexpr void setX(K nX)
Definition: NRE_Vector3D.hpp:151
constexpr Vector3D & operator+=(K k)
Definition: NRE_Vector3D.hpp:340
constexpr void setR(K r)
Definition: NRE_Vector3D.hpp:175
constexpr Vector3D & operator*=(K k)
Definition: NRE_Vector3D.hpp:378
Manage hashing for specialized version.
constexpr T getY() const
Vector3D & pow(K p)
Definition: NRE_Vector3D.hpp:271
Math&#39;s API.
constexpr Vector3D & operator=(Vector3D const &u)=default
constexpr Vector3D< std::common_type_t< T, K > > operator/(K k) const
Definition: NRE_Vector3D.hpp:485
constexpr T & operator[](std::size_t index)
constexpr Vector3D(K value)
Definition: NRE_Vector3D.hpp:63
constexpr bool operator>=(Vector3D< K > const &u) const
The stl standard namespace.
Utility::String toString() const
A cartesian 3D vector, 2D homogeneous.
Definition: NRE_Matrix3x3.hpp:33
constexpr std::common_type_t< T, K > operator|=(Vector3D< K > const &u) const
constexpr void setY(K nY)
Definition: NRE_Vector3D.hpp:159
constexpr void setB(K b)
Definition: NRE_Vector3D.hpp:191
constexpr std::common_type_t< T, K > distanceSquared(Vector3D< K > const &v) const
constexpr T getR() const
constexpr void setCoord(Vector2D< K > const &u, L nZ)
Definition: NRE_Vector3D.hpp:212
constexpr void setG(K g)
Definition: NRE_Vector3D.hpp:183
constexpr bool operator==(Vector3D< K > const &u) const
constexpr const T * value() const
constexpr T getB() const
size_t operator()(NRE::Math::Vector3D< float > const &p) const
Definition: NRE_Vector3D.hpp:632
The NearlyRealEngine&#39;s global namespace.
long double norm() const
constexpr T getZ() const
A cartesian 4D vector, 3D homogeneous.
Definition: NRE_Matrix4x4.hpp:34
constexpr Vector3D()=default
constexpr Vector3D< std::common_type_t< T, K > > operator+(K k) const
Definition: NRE_Vector3D.hpp:432
constexpr T getX() const
constexpr std::common_type_t< T, K > operator|(Vector3D< K > const &u) const
constexpr void setCoord(K nX, L nY, N nZ)
Definition: NRE_Vector3D.hpp:201
Vector3D & normalize()
constexpr T normSquared() const
constexpr Vector2D< std::common_type_t< T, K > > reflect(Vector2D< T > const &u, Vector2D< K > const &n)
constexpr Vector3D & operator/=(K k)
Definition: NRE_Vector3D.hpp:397
constexpr Vector3D(Vector2D< K > const &u, L nZ)
Definition: NRE_Vector3D.hpp:110
long double distance(Vector3D< K > const &v) const
constexpr Vector3D(K nX, L nY, N nZ)
Definition: NRE_Vector3D.hpp:56
constexpr void setRGB(K r, L g, N b)
Definition: NRE_Vector3D.hpp:224
constexpr T getX() const
constexpr void setZ(K nZ)
Definition: NRE_Vector3D.hpp:167
constexpr Vector3D & operator-=(K k)
Definition: NRE_Vector3D.hpp:359
constexpr T getY() const
constexpr Vector3D< std::common_type_t< T, K > > operator*(K k) const
Definition: NRE_Vector3D.hpp:469
constexpr Vector3D & operator^=(Vector3D< K > const &u)
void limit(K max)
Definition: NRE_Vector3D.hpp:259