NRE_Vector4D.hpp
Go to the documentation of this file.
1 
10  #pragma once
11 
12  #include <type_traits>
13  #include <ostream>
14 
15  #include <Utility/String/NRE_String.hpp>
16  #include <Utility/Interfaces/Stringable/NRE_Stringable.hpp>
17  #include "../../NRE_Math.hpp"
18 
23  namespace NRE {
28  namespace Math {
29 
30  template<class> class Vector2D;
31  template<class> class Vector3D;
32 
37  template <class T>
38  class Vector4D : public Utility::Stringable<Vector4D<T>> {
39  static_assert(ArithmeticCheckerV<T>);
41  private : //Fields
42  T x = 0;
43  T y = 0;
44  T z = 0;
45  T w = 0;
47  public: // Methods
48  //## Constructor ##//
52  constexpr Vector4D() = default;
60  template <class K, class L, class N, class M, typename = UseIfArithmetic<K, L, N, M>>
61  constexpr Vector4D(K nX, L nY, N nZ, M nW) : x(static_cast <T> (nX)), y(static_cast <T> (nY)), z(static_cast <T> (nZ)), w(static_cast <T> (nW)) {
62  }
67  template <class K, typename = UseIfArithmetic<K>>
68  constexpr Vector4D(K value) : Vector4D(value, value, value, value) {
69  }
74  constexpr Vector4D(std::initializer_list<T> list);
75 
76  //## Copy-Constructor ##//
81  constexpr Vector4D(Vector4D const& u) = default;
82 
83  //## Move-Constructor ##//
88  constexpr Vector4D(Vector4D && u) = default;
89 
90  //## Convertor ##//
95  template <class K>
96  constexpr Vector4D(Vector4D<K> const& u);
101  template <class K>
102  constexpr Vector4D(Vector2D<K> const& u);
109  template <class K, class L, class N, typename = UseIfArithmetic<L, N>>
110  constexpr Vector4D(Vector2D<K> const& u, L nZ, N nW) : Vector4D(u.getX(), u.getY(), nZ, nW) {
111  }
116  template <class K>
117  constexpr Vector4D(Vector3D<K> const& u);
123  template <class K, class L, typename = UseIfArithmetic<L>>
124  constexpr Vector4D(Vector3D<K> const& u, L nW) : Vector4D(u.getX(), u.getY(), u.getZ(), nW) {
125  }
126 
127  //## Deconstructor ##//
131  ~Vector4D() = default;
132 
133  //## Getter ##//
137  constexpr T getX() const;
141  constexpr T getY() const;
145  constexpr T getZ() const;
149  constexpr T getW() const;
153  constexpr T getR() const;
157  constexpr T getG() const;
161  constexpr T getB() const;
165  constexpr T getA() const;
166 
167  //## Setter ##//
172  template <class K, typename = UseIfArithmetic<K>>
173  constexpr void setX(K nX) {
174  x = static_cast <T> (nX);
175  }
180  template <class K, typename = UseIfArithmetic<K>>
181  constexpr void setY(K nY) {
182  y = static_cast <T> (nY);
183  }
188  template <class K, typename = UseIfArithmetic<K>>
189  constexpr void setZ(K nZ) {
190  z = static_cast <T> (nZ);
191  }
196  template <class K, typename = UseIfArithmetic<K>>
197  constexpr void setW(K nW) {
198  w = static_cast <T> (nW);
199  }
204  template <class K, typename = UseIfArithmetic<K>>
205  constexpr void setR(K r) {
206  setX(r);
207  }
212  template <class K, typename = UseIfArithmetic<K>>
213  constexpr void setG(K g) {
214  setY(g);
215  }
220  template <class K, typename = UseIfArithmetic<K>>
221  constexpr void setB(K b) {
222  setZ(b);
223  }
228  template <class K, typename = UseIfArithmetic<K>>
229  constexpr void setA(K a) {
230  setW(a);
231  }
239  template <class K, class L, class N, class M, typename = UseIfArithmetic<K, L, N, M>>
240  constexpr void setCoord(K nX, L nY, N nZ, M nW) {
241  setX(nX);
242  setY(nY);
243  setZ(nZ);
244  setW(nW);
245  }
252  template <class K, class L, class N, typename = UseIfArithmetic<L, N>>
253  constexpr void setCoord(Vector2D<K> const& u, L nZ, N nW) {
254  setX(u.getX());
255  setY(u.getY());
256  setZ(nZ);
257  setW(nW);
258  }
264  template <class K, class L, typename = UseIfArithmetic<L>>
265  constexpr void setCoord(Vector3D<K> const& u, L nW) {
266  setX(u.getX());
267  setY(u.getY());
268  setZ(u.getZ());
269  setW(nW);
270  }
278  template <class K, class L, class N, class M, typename = UseIfArithmetic<K, L, N, M>>
279  constexpr void setRGBA(K r, L g, N b, M a) {
280  setX(r);
281  setY(g);
282  setZ(b);
283  setW(a);
284  }
290  template <class K, class L, typename = UseIfArithmetic<L>>
291  constexpr void setRGBA(Vector3D<K> const& u, L a) {
292  setX(u.getX());
293  setY(u.getY());
294  setZ(u.getZ());
295  setW(a);
296  }
297 
298  //## Methods ##//
302  long double norm() const;
306  constexpr T normSquared() const;
310  template <class K>
311  long double distance(Vector4D<K> const& v) const;
315  template <class K>
316  constexpr std::common_type_t<T, K> distanceSquared(Vector4D<K> const& v) const;
321  Vector4D& normalize();
326  template <class K, typename = UseIfArithmetic<K>>
327  void limit(K max) {
328  auto n = norm();
329  if (n > max) {
330  normalize();
331  }
332  }
338  template <class K, typename = UseIfArithmetic<K>>
339  Vector4D& pow(K p) {
340  setX(std::pow(static_cast <std::common_type_t<T, K>> (x), static_cast <std::common_type_t<T, K>> (p)));
341  setY(std::pow(static_cast <std::common_type_t<T, K>> (y), static_cast <std::common_type_t<T, K>> (p)));
342  setZ(std::pow(static_cast <std::common_type_t<T, K>> (z), static_cast <std::common_type_t<T, K>> (p)));
343  setW(std::pow(static_cast <std::common_type_t<T, K>> (w), static_cast <std::common_type_t<T, K>> (p)));
344  return *this;
345  }
351  template <class K>
352  Vector4D& pow(Vector4D<K> const& p);
356  constexpr const T* value() const;
357 
358  //## Access Operator ##//
365  constexpr T& operator [](std::size_t index);
372  constexpr T const& operator [](std::size_t index) const;
373 
374  //## Assignment Operator ##//
380  constexpr Vector4D& operator =(Vector4D const& u) = default;
386  constexpr Vector4D& operator =(Vector4D && u) = default;
392  template <class K>
393  constexpr Vector4D& operator =(Vector4D<K> const& u);
399  template <class K>
400  constexpr Vector4D& operator =(Vector4D<K> && u);
401 
402  //## Shortcut Operator ##//
408  template <class K, typename = UseIfArithmetic<K>>
409  constexpr Vector4D& operator +=(K k) {
410  setX(static_cast <std::common_type_t<T, K>> (x) + static_cast <std::common_type_t<T, K>> (k));
411  setY(static_cast <std::common_type_t<T, K>> (y) + static_cast <std::common_type_t<T, K>> (k));
412  setZ(static_cast <std::common_type_t<T, K>> (z) + static_cast <std::common_type_t<T, K>> (k));
413  setW(static_cast <std::common_type_t<T, K>> (w) + static_cast <std::common_type_t<T, K>> (k));
414  return *this;
415  }
421  template <class K>
422  constexpr Vector4D& operator +=(Vector4D<K> const& u);
428  template <class K, typename = UseIfArithmetic<K>>
429  constexpr Vector4D& operator -=(K k) {
430  setX(static_cast <std::common_type_t<T, K>> (x) - static_cast <std::common_type_t<T, K>> (k));
431  setY(static_cast <std::common_type_t<T, K>> (y) - static_cast <std::common_type_t<T, K>> (k));
432  setZ(static_cast <std::common_type_t<T, K>> (z) - static_cast <std::common_type_t<T, K>> (k));
433  setW(static_cast <std::common_type_t<T, K>> (w) - static_cast <std::common_type_t<T, K>> (k));
434  return *this;
435  }
441  template <class K>
442  constexpr Vector4D& operator -=(Vector4D<K> const& u);
448  template <class K, typename = UseIfArithmetic<K>>
449  constexpr Vector4D& operator *=(K k) {
450  setX(static_cast <std::common_type_t<T, K>> (x) * static_cast <std::common_type_t<T, K>> (k));
451  setY(static_cast <std::common_type_t<T, K>> (y) * static_cast <std::common_type_t<T, K>> (k));
452  setZ(static_cast <std::common_type_t<T, K>> (z) * static_cast <std::common_type_t<T, K>> (k));
453  setW(static_cast <std::common_type_t<T, K>> (w) * static_cast <std::common_type_t<T, K>> (k));
454  return *this;
455  }
461  template <class K>
462  constexpr Vector4D& operator *=(Vector4D<K> const& u);
468  template <class K, typename = UseIfArithmetic<K>>
469  constexpr Vector4D& operator /=(K k) {
470  setX(static_cast <std::common_type_t<T, K>> (x) / static_cast <std::common_type_t<T, K>> (k));
471  setY(static_cast <std::common_type_t<T, K>> (y) / static_cast <std::common_type_t<T, K>> (k));
472  setZ(static_cast <std::common_type_t<T, K>> (z) / static_cast <std::common_type_t<T, K>> (k));
473  setW(static_cast <std::common_type_t<T, K>> (w) / static_cast <std::common_type_t<T, K>> (k));
474  return *this;
475  }
481  template <class K>
482  constexpr Vector4D& operator /=(Vector4D<K> const& u);
488  template <class K>
489  constexpr std::common_type_t<T, K> operator |=(Vector4D<K> const& u) const;
495  template <class K>
496  constexpr Vector4D& operator ^=(Vector4D<K> const& u);
497 
498  //## Arithmetic Operator ##//
504  template <class K, typename = UseIfArithmetic<K>>
506  return Vector4D<std::common_type_t<T, K>>(*this) += k;
507  }
513  template <class K>
514  constexpr Vector4D<std::common_type_t<T, K>> operator +(Vector4D<K> const& u) const;
520  template <class K, typename = UseIfArithmetic<K>>
522  return Vector4D<std::common_type_t<T, K>>(*this) -= k;
523  }
529  template <class K>
530  constexpr Vector4D<std::common_type_t<T, K>> operator -(Vector4D<K> const& u) const;
535  constexpr Vector4D operator -() const;
541  template <class K, typename = UseIfArithmetic<K>>
543  return Vector4D<std::common_type_t<T, K>>(*this) *= k;
544  }
550  template <class K>
551  constexpr Vector4D<std::common_type_t<T, K>> operator *(Vector4D<K> const& u) const;
557  template <class K, typename = UseIfArithmetic<K>>
559  return Vector4D<std::common_type_t<T, K>>(*this) /= k;
560  }
566  template <class K>
567  constexpr Vector4D<std::common_type_t<T, K>> operator /(Vector4D<K> const& u) const;
573  template <class K>
574  constexpr std::common_type_t<T, K> operator |(Vector4D<K> const& u) const;
580  template <class K>
581  constexpr Vector4D<std::common_type_t<T, K>> operator ^(Vector4D<K> const& u) const;
582 
583  //## Comparison Operator ##//
589  template <class K>
590  constexpr bool operator ==(Vector4D<K> const& u) const;
596  template <class K>
597  constexpr bool operator !=(Vector4D<K> const& u) const;
603  template <class K>
604  constexpr bool operator <(Vector4D<K> const& u) const;
610  template <class K>
611  constexpr bool operator >(Vector4D<K> const& u) const;
617  template <class K>
618  constexpr bool operator <=(Vector4D<K> const& u) const;
624  template <class K>
625  constexpr bool operator >=(Vector4D<K> const& u) const;
626 
627  //## Stream Operator ##//
632  Utility::String toString() const;
633  };
634 
641  template <class T, class K, typename = UseIfArithmetic<K>>
643  return u * k;
644  }
650  template <class T>
658  template <class T, class K, typename = UseIfArithmetic<K>>
661  }
668  template <class T, class K>
676  template <class T, class K>
677  constexpr Vector4D<std::common_type_t<T, K>> reflect(Vector4D<T> const& u, Vector4D<K> const& n);
678 
679  template <class T>
680  using Point4D = Vector4D<T>;
681  }
682  }
683 
688  namespace std {
689  template <class T, class K>
690  struct common_type<NRE::Math::Vector4D<T>, NRE::Math::Vector4D<K>> {
692  };
693  }
694 
695  #include "NRE_Vector4D.tpp"
constexpr void setR(K r)
Definition: NRE_Vector4D.hpp:205
constexpr Vector4D & operator*=(K k)
Definition: NRE_Vector4D.hpp:449
A cartesian 2D vector.
Definition: NRE_Matrix3x3.hpp:32
constexpr T getR() const
Vector4D & normalize()
constexpr void setY(K nY)
Definition: NRE_Vector4D.hpp:181
constexpr Vector4D(Vector3D< K > const &u, L nW)
Definition: NRE_Vector4D.hpp:124
constexpr Vector4D & operator/=(K k)
Definition: NRE_Vector4D.hpp:469
constexpr void setB(K b)
Definition: NRE_Vector4D.hpp:221
constexpr Vector4D & operator+=(K k)
Definition: NRE_Vector4D.hpp:409
constexpr void setCoord(Vector2D< K > const &u, L nZ, N nW)
Definition: NRE_Vector4D.hpp:253
constexpr const T * value() const
constexpr T & operator[](std::size_t index)
constexpr Vector4D< std::common_type_t< T, K > > operator/(K k) const
Definition: NRE_Vector4D.hpp:558
constexpr T normSquared() const
constexpr bool operator==(Vector4D< K > const &u) const
constexpr T getA() const
constexpr T getG() const
constexpr Vector4D(K value)
Definition: NRE_Vector4D.hpp:68
constexpr bool operator!=(Vector4D< K > const &u) const
constexpr T getY() const
constexpr void setRGBA(K r, L g, N b, M a)
Definition: NRE_Vector4D.hpp:279
constexpr Vector4D< std::common_type_t< T, K > > operator^(Vector4D< K > const &u) const
Math&#39;s API.
Utility::String toString() const
long double norm() const
constexpr std::common_type_t< T, K > operator|=(Vector4D< K > const &u) const
The stl standard namespace.
constexpr void setCoord(K nX, L nY, N nZ, M nW)
Definition: NRE_Vector4D.hpp:240
A cartesian 3D vector, 2D homogeneous.
Definition: NRE_Matrix3x3.hpp:33
constexpr Vector4D operator-() const
constexpr T getY() const
constexpr void setZ(K nZ)
Definition: NRE_Vector4D.hpp:189
constexpr Vector4D()=default
constexpr bool operator>(Vector4D< K > const &u) const
constexpr Vector4D & operator^=(Vector4D< K > const &u)
constexpr Vector4D< std::common_type_t< T, K > > operator+(K k) const
Definition: NRE_Vector4D.hpp:505
constexpr T getW() const
constexpr Vector4D(K nX, L nY, N nZ, M nW)
Definition: NRE_Vector4D.hpp:61
constexpr T getB() const
constexpr Vector4D & operator=(Vector4D const &u)=default
constexpr void setRGBA(Vector3D< K > const &u, L a)
Definition: NRE_Vector4D.hpp:291
The NearlyRealEngine&#39;s global namespace.
constexpr void setX(K nX)
Definition: NRE_Vector4D.hpp:173
long double distance(Vector4D< K > const &v) const
constexpr T getZ() const
A cartesian 4D vector, 3D homogeneous.
Definition: NRE_Matrix4x4.hpp:34
constexpr void setCoord(Vector3D< K > const &u, L nW)
Definition: NRE_Vector4D.hpp:265
constexpr Vector4D(Vector2D< K > const &u, L nZ, N nW)
Definition: NRE_Vector4D.hpp:110
constexpr T getX() const
constexpr std::common_type_t< T, K > distanceSquared(Vector4D< K > const &v) const
constexpr Vector2D< std::common_type_t< T, K > > reflect(Vector2D< T > const &u, Vector2D< K > const &n)
constexpr Vector4D< std::common_type_t< T, K > > operator*(K k) const
Definition: NRE_Vector4D.hpp:542
void limit(K max)
Definition: NRE_Vector4D.hpp:327
Vector4D & pow(K p)
Definition: NRE_Vector4D.hpp:339
constexpr T getX() const
constexpr T getZ() const
constexpr void setA(K a)
Definition: NRE_Vector4D.hpp:229
constexpr T getX() const
constexpr Vector4D & operator-=(K k)
Definition: NRE_Vector4D.hpp:429
constexpr std::common_type_t< T, K > operator|(Vector4D< K > const &u) const
constexpr T getY() const
constexpr void setG(K g)
Definition: NRE_Vector4D.hpp:213
constexpr bool operator>=(Vector4D< K > const &u) const
constexpr void setW(K nW)
Definition: NRE_Vector4D.hpp:197