NRE_Vector2D.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 
16  #include <cassert>
17 
22  namespace NRE {
27  namespace Math {
28 
29  template<class> class Vector3D;
30  template<class> class Vector4D;
31 
36  template <class T>
37  class Vector2D : public Utility::Stringable<Vector2D<T>> {
38  static_assert(ArithmeticCheckerV<T>);
40  private : // Fields
41  T x = 0;
42  T y = 0;
44  public : // Methods
45  //## Constructor ##//
49  constexpr Vector2D() = default;
55  template <class K, class L, typename = UseIfArithmetic<K, L>>
56  constexpr Vector2D(K nX, L nY) : x(static_cast <T> (nX)), y(static_cast <T> (nY)) {
57  }
62  template <class K, typename = UseIfArithmetic<K>>
63  constexpr Vector2D(K value) : Vector2D(value, value) {
64  }
69  constexpr Vector2D(std::initializer_list<T> list);
70 
71  //## Copy-Constructor ##//
76  constexpr Vector2D(Vector2D const& u) = default;
77 
78  //## Move-Constructor ##//
83  constexpr Vector2D(Vector2D && u) = default;
84 
85  //## Convertor ##//
90  template <class K>
91  constexpr Vector2D(Vector2D<K> const& u);
96  template <class K>
97  constexpr Vector2D(Vector3D<K> const& u);
102  template <class K>
103  constexpr Vector2D(Vector4D<K> const& u);
104 
105  //## Deconstructor ##//
109  ~Vector2D() = default;
110 
111  //## Getter ##//
115  constexpr T getX() const;
119  constexpr T getY() const;
123  constexpr T getW() const;
127  constexpr T getH() const;
128 
129  //## Setter ##//
134  template <class K, typename = UseIfArithmetic<K>>
135  constexpr void setX(K nX) {
136  x = static_cast <T> (nX);
137  }
142  template <class K, typename = UseIfArithmetic<K>>
143  constexpr void setY(K nY) {
144  y = static_cast <T> (nY);
145  }
150  template <class K, typename = UseIfArithmetic<K>>
151  constexpr void setW(K w) {
152  setX(w);
153  }
158  template <class K, typename = UseIfArithmetic<K>>
159  constexpr void setH(K h) {
160  setY(h);
161  }
167  template <class K, class L, typename = UseIfArithmetic<K, L>>
168  constexpr void setCoord(K nX, L nY) {
169  setX(nX);
170  setY(nY);
171  }
177  template <class K, class L, typename = UseIfArithmetic<K, L>>
178  constexpr void setSize(K w, L h) {
179  setX(w);
180  setY(h);
181  }
182 
183  //## Methods ##//
187  long double norm() const;
191  constexpr T normSquared() const;
195  template <class K>
196  long double distance(Vector2D<K> const& v) const;
200  template <class K>
201  constexpr std::common_type_t<T, K> distanceSquared(Vector2D<K> const& v) const;
206  Vector2D& normalize();
211  template <class K, typename = UseIfArithmetic<K>>
212  void limit(K max) {
213  auto n = norm();
214  if (n > max) {
215  normalize();
216  }
217  }
223  template <class K, typename = UseIfArithmetic<K>>
224  Vector2D& pow(K p) {
225  setX(std::pow(static_cast <std::common_type_t<T, K>> (x), static_cast <std::common_type_t<T, K>> (p)));
226  setY(std::pow(static_cast <std::common_type_t<T, K>> (y), static_cast <std::common_type_t<T, K>> (p)));
227  return *this;
228  }
234  template <class K>
235  Vector2D& pow(Vector2D<K> const& p);
239  constexpr const T* value() const;
240 
241  //## Access Operator ##//
248  constexpr T& operator [](std::size_t index);
255  constexpr T const& operator [](std::size_t index) const;
256 
257  //## Assignment Operator ##//
263  constexpr Vector2D& operator =(Vector2D const& u) = default;
269  constexpr Vector2D& operator =(Vector2D && u) = default;
275  template <class K>
276  constexpr Vector2D& operator =(Vector2D<K> const& u);
282  template <class K>
283  constexpr Vector2D& operator =(Vector2D<K> && u);
284 
285  //## Shortcut Operator ##//
291  template <class K, typename = UseIfArithmetic<K>>
292  constexpr Vector2D& operator +=(K k) {
293  setX(static_cast <std::common_type_t<T, K>> (x) + static_cast <std::common_type_t<T, K>> (k));
294  setY(static_cast <std::common_type_t<T, K>> (y) + static_cast <std::common_type_t<T, K>> (k));
295  return *this;
296  }
302  template <class K>
303  constexpr Vector2D& operator +=(Vector2D<K> const& u);
309  template <class K, typename = UseIfArithmetic<K>>
310  constexpr Vector2D& operator -=(K k) {
311  setX(static_cast <std::common_type_t<T, K>> (x) - static_cast <std::common_type_t<T, K>> (k));
312  setY(static_cast <std::common_type_t<T, K>> (y) - static_cast <std::common_type_t<T, K>> (k));
313  return *this;
314  }
320  template <class K>
321  constexpr Vector2D& operator -=(Vector2D<K> const& u);
327  template <class K, typename = UseIfArithmetic<K>>
328  constexpr Vector2D& operator *=(K k) {
329  setX(static_cast <std::common_type_t<T, K>> (x) * static_cast <std::common_type_t<T, K>> (k));
330  setY(static_cast <std::common_type_t<T, K>> (y) * static_cast <std::common_type_t<T, K>> (k));
331  return *this;
332  }
338  template <class K>
339  constexpr Vector2D& operator *=(Vector2D<K> const& u);
345  template <class K, typename = UseIfArithmetic<K>>
346  constexpr Vector2D& operator /=(K k) {
347  setX(static_cast <std::common_type_t<T, K>> (x) / static_cast <std::common_type_t<T, K>> (k));
348  setY(static_cast <std::common_type_t<T, K>> (y) / static_cast <std::common_type_t<T, K>> (k));
349  return *this;
350  }
356  template <class K>
357  constexpr Vector2D& operator /=(Vector2D<K> const& u);
363  template <class K>
364  constexpr std::common_type_t<T, K> operator |=(Vector2D<K> const& u) const;
365 
366  //## Arithmetic Operator ##//
372  template <class K, typename = UseIfArithmetic<K>>
374  return Vector2D<std::common_type_t<T, K>>(*this) += k;
375  }
381  template <class K>
382  constexpr Vector2D<std::common_type_t<T, K>> operator +(Vector2D<K> const& u) const;
388  template <class K, typename = UseIfArithmetic<K>>
390  return Vector2D<std::common_type_t<T, K>>(*this) -= k;
391  }
397  template <class K>
398  constexpr Vector2D<std::common_type_t<T, K>> operator -(Vector2D<K> const& u) const;
403  constexpr Vector2D operator -() const;
409  template <class K, typename = UseIfArithmetic<K>>
411  return Vector2D<std::common_type_t<T, K>>(*this) *= k;
412  }
418  template <class K>
419  constexpr Vector2D<std::common_type_t<T, K>> operator *(Vector2D<K> const& u) const;
425  template <class K, typename = UseIfArithmetic<K>>
427  return Vector2D<std::common_type_t<T, K>>(*this) /= k;
428  }
434  template <class K>
435  constexpr Vector2D<std::common_type_t<T, K>> operator /(Vector2D<K> const& u) const;
441  template <class K>
442  constexpr std::common_type_t<T, K> operator |(Vector2D<K> const& u) const;
443 
444  //## Comparison Operator ##//
450  template <class K>
451  constexpr bool operator ==(Vector2D<K> const& u) const;
457  template <class K>
458  constexpr bool operator !=(Vector2D<K> const& u) const;
464  template <class K>
465  constexpr bool operator <(Vector2D<K> const& u) const;
471  template <class K>
472  constexpr bool operator >(Vector2D<K> const& u) const;
478  template <class K>
479  constexpr bool operator <=(Vector2D<K> const& u) const;
485  template <class K>
486  constexpr bool operator >=(Vector2D<K> const& u) const;
487 
488  //## Stream Operator ##//
493  Utility::String toString() const;
494  };
495 
502  template <class T, class K, typename = UseIfArithmetic<K>>
504  return u * k;
505  }
511  template <class T>
519  template <class T, class K, typename = UseIfArithmetic<K>>
522  }
529  template <class T, class K>
537  template <class T, class K>
538  constexpr Vector2D<std::common_type_t<T, K>> reflect(Vector2D<T> const& u, Vector2D<K> const& n);
539 
540  template <class T>
541  using Point2D = Vector2D<T>;
542  }
543  }
544 
549  namespace std {
550  template <class T, class K>
551  struct common_type<NRE::Math::Vector2D<T>, NRE::Math::Vector2D<K>> {
553  };
554  }
555 
556  #include "NRE_Vector2D.tpp"
constexpr bool operator!=(Vector2D< K > const &u) const
constexpr const T * value() const
A cartesian 2D vector.
Definition: NRE_Matrix3x3.hpp:32
constexpr bool operator>(Vector2D< K > const &u) const
constexpr Vector2D & operator+=(K k)
Definition: NRE_Vector2D.hpp:292
constexpr T getH() const
constexpr void setX(K nX)
Definition: NRE_Vector2D.hpp:135
constexpr T normSquared() const
constexpr T getW() const
constexpr bool operator==(Vector2D< K > const &u) const
constexpr Vector2D & operator-=(K k)
Definition: NRE_Vector2D.hpp:310
constexpr std::common_type_t< T, K > operator|=(Vector2D< K > const &u) const
constexpr Vector2D< std::common_type_t< T, K > > operator+(K k) const
Definition: NRE_Vector2D.hpp:373
constexpr Vector2D< std::common_type_t< T, K > > operator/(K k) const
Definition: NRE_Vector2D.hpp:426
constexpr std::common_type_t< T, K > distanceSquared(Vector2D< K > const &v) const
Math&#39;s API.
The stl standard namespace.
constexpr Vector2D(K nX, L nY)
Definition: NRE_Vector2D.hpp:56
A cartesian 3D vector, 2D homogeneous.
Definition: NRE_Matrix3x3.hpp:33
constexpr void setSize(K w, L h)
Definition: NRE_Vector2D.hpp:178
long double distance(Vector2D< K > const &v) const
constexpr void setW(K w)
Definition: NRE_Vector2D.hpp:151
Utility::String toString() const
constexpr void setY(K nY)
Definition: NRE_Vector2D.hpp:143
Vector2D & pow(K p)
Definition: NRE_Vector2D.hpp:224
constexpr Vector2D & operator=(Vector2D const &u)=default
constexpr Vector2D & operator/=(K k)
Definition: NRE_Vector2D.hpp:346
constexpr Vector2D()=default
constexpr bool operator>=(Vector2D< K > const &u) const
The NearlyRealEngine&#39;s global namespace.
constexpr void setH(K h)
Definition: NRE_Vector2D.hpp:159
Vector2D & normalize()
A cartesian 4D vector, 3D homogeneous.
Definition: NRE_Matrix4x4.hpp:34
constexpr T getX() const
constexpr std::common_type_t< T, K > operator|(Vector2D< K > const &u) const
constexpr Vector2D< std::common_type_t< T, K > > operator*(K k) const
Definition: NRE_Vector2D.hpp:410
constexpr Vector2D(K value)
Definition: NRE_Vector2D.hpp:63
long double norm() const
constexpr Vector2D< std::common_type_t< T, K > > reflect(Vector2D< T > const &u, Vector2D< K > const &n)
void limit(K max)
Definition: NRE_Vector2D.hpp:212
constexpr Vector2D operator-() const
constexpr T getY() const
constexpr void setCoord(K nX, L nY)
Definition: NRE_Vector2D.hpp:168
constexpr T & operator[](std::size_t index)
constexpr Vector2D & operator*=(K k)
Definition: NRE_Vector2D.hpp:328