lxgui
gui_vector2.hpp
1 #ifndef LXGUI_GUI_VECTOR2_HPP
2 #define LXGUI_GUI_VECTOR2_HPP
3 
4 #include "lxgui/lxgui.hpp"
5 #include "lxgui/utils.hpp"
6 
7 #include <cmath>
8 #include <type_traits>
9 
10 namespace lxgui::gui {
11 
13 template<typename T>
14 struct vector2 {
15  using float_type = std::conditional_t<std::is_floating_point_v<T>, T, double>;
16 
17  constexpr vector2() = default;
18 
19  constexpr vector2(T nx, T ny) noexcept : x(nx), y(ny) {}
20 
21  template<typename U>
22  explicit constexpr vector2(const vector2<U>& v) noexcept :
23  x(static_cast<T>(v.x)), y(static_cast<T>(v.y)) {}
24 
25  void set(T nx, T ny) noexcept {
26  x = nx;
27  y = ny;
28  }
29 
30  T get_norm_squared() const noexcept {
31  return x * x + y * y;
32  }
33 
34  float_type get_norm() const noexcept {
35  return std::sqrt(static_cast<float_type>(get_norm_squared()));
36  }
37 
38  vector2<float_type> get_unit() const noexcept {
39  vector2<float_type> vec(static_cast<float_type>(x), static_cast<float_type>(y));
40  const typename vector2<float_type>::float_type norm = get_norm();
41  vec.x /= norm;
42  vec.y /= norm;
43  return vec;
44  }
45 
46  vector2<float_type> get_normal() const noexcept {
47  vector2<float_type> vec(static_cast<float_type>(-y), static_cast<float_type>(x));
48  const typename vector2<float_type>::float_type norm = get_norm();
49  vec.x /= norm;
50  vec.y /= norm;
51  return vec;
52  }
53 
54  vector2 get_rotated(float_type angle) const noexcept {
55  vector2<float_type> vec(static_cast<float_type>(x), static_cast<float_type>(y));
56  vector2<float_type> orig = vec;
57 
58  const float_type ca = std::cos(angle);
59  const float_type sa = std::sin(angle);
60 
61  vec.x = static_cast<T>(orig.x * ca - orig.y * sa);
62  vec.y = static_cast<T>(orig.x * sa + orig.y * ca);
63 
64  return vec;
65  }
66 
67  vector2 get_scaled(const vector2& v) const noexcept {
68  vector2 vec = *this;
69  vec.scale(v);
70  return vec;
71  }
72 
73  vector2 operator+(const vector2& v) const noexcept {
74  return vector2(x + v.x, y + v.y);
75  }
76 
77  vector2& operator+=(const vector2& v) noexcept {
78  x += v.x;
79  y += v.y;
80  return *this;
81  }
82 
83  vector2 operator-() const noexcept {
84  return vector2(-x, -y);
85  }
86 
87  vector2 operator-(const vector2& v) const noexcept {
88  return vector2(x - v.x, y - v.y);
89  }
90 
91  vector2& operator-=(const vector2& v) noexcept {
92  x -= v.x;
93  y -= v.y;
94  return *this;
95  }
96 
97  bool operator==(const vector2& v) const noexcept {
98  return (x == v.x) && (y == v.y);
99  }
100 
101  bool operator!=(const vector2& v) const noexcept {
102  return (x != v.x) || (y != v.y);
103  }
104 
105  vector2 operator*(T value) const noexcept {
106  return vector2(x * value, y * value);
107  }
108 
109  vector2 operator*(const vector2& value) const noexcept {
110  return vector2(x * value.x, y * value.y);
111  }
112 
113  vector2& operator*=(T value) noexcept {
114  x *= value;
115  y *= value;
116  return *this;
117  }
118 
119  vector2& operator*=(const vector2& value) noexcept {
120  x *= value.x;
121  y *= value.y;
122  return *this;
123  }
124 
125  vector2 operator/(T value) const noexcept {
126  return vector2(x / value, y / value);
127  }
128 
129  vector2 operator/(const vector2& value) const noexcept {
130  return vector2(x / value.x, y / value.y);
131  }
132 
133  vector2& operator/=(T value) noexcept {
134  x /= value;
135  y /= value;
136  return *this;
137  }
138 
139  vector2& operator/=(const vector2& value) noexcept {
140  x /= value.x;
141  y /= value.y;
142  return *this;
143  }
144 
145  T dot(const vector2& v) const noexcept {
146  return x * v.x + y * v.y;
147  }
148 
149  static const vector2 zero;
150  static const vector2 unit;
151  static const vector2 unit_x;
152  static const vector2 unit_y;
153 
154  T x = 0, y = 0;
155 };
156 
157 template<typename T>
158 constexpr vector2<T> vector2<T>::zero(0, 0);
159 
160 template<typename T>
161 constexpr vector2<T> vector2<T>::unit(1, 1);
162 
163 template<typename T>
164 constexpr vector2<T> vector2<T>::unit_x(1, 0);
165 
166 template<typename T>
167 constexpr vector2<T> vector2<T>::unit_y(0, 1);
168 
177 
178 template<typename T>
179 vector2<T> operator*(T value, const vector2<T>& v) noexcept {
180  return vector2<T>(v.x * value, v.y * value);
181 }
182 
183 template<typename O, typename T>
184 O& operator<<(O& stream, const vector2<T>& v) {
185  return stream << v.x << ", " << v.y;
186 }
187 
188 } // namespace lxgui::gui
189 
190 #endif
std::ostream & operator<<(std::ostream &stream, const color &c)
Definition: gui_color.cpp:212
color operator*(const color &c1, const color &c2) noexcept
Definition: gui_color.cpp:200
Holds 2D coordinates.
Definition: gui_vector2.hpp:14
T get_norm_squared() const noexcept
Definition: gui_vector2.hpp:30
vector2 & operator-=(const vector2 &v) noexcept
Definition: gui_vector2.hpp:91
vector2 operator*(T value) const noexcept
void set(T nx, T ny) noexcept
Definition: gui_vector2.hpp:25
vector2 & operator/=(const vector2 &value) noexcept
vector2 operator*(const vector2 &value) const noexcept
float_type get_norm() const noexcept
Definition: gui_vector2.hpp:34
static const vector2 unit_y
vector2 operator/(const vector2 &value) const noexcept
static const vector2 unit_x
constexpr vector2(T nx, T ny) noexcept
Definition: gui_vector2.hpp:19
static const vector2 zero
static const vector2 unit
T dot(const vector2 &v) const noexcept
vector2< float_type > get_unit() const noexcept
Definition: gui_vector2.hpp:38
vector2 & operator/=(T value) noexcept
vector2 get_rotated(float_type angle) const noexcept
Definition: gui_vector2.hpp:54
vector2 & operator*=(const vector2 &value) noexcept
constexpr vector2()=default
vector2 operator-(const vector2 &v) const noexcept
Definition: gui_vector2.hpp:87
vector2< float_type > get_normal() const noexcept
Definition: gui_vector2.hpp:46
std::conditional_t< std::is_floating_point_v< T >, T, double > float_type
Definition: gui_vector2.hpp:15
vector2 operator/(T value) const noexcept
vector2 operator-() const noexcept
Definition: gui_vector2.hpp:83
constexpr vector2(const vector2< U > &v) noexcept
Definition: gui_vector2.hpp:22
vector2 operator+(const vector2 &v) const noexcept
Definition: gui_vector2.hpp:73
bool operator!=(const vector2 &v) const noexcept
vector2 & operator*=(T value) noexcept
vector2 get_scaled(const vector2 &v) const noexcept
Definition: gui_vector2.hpp:67
bool operator==(const vector2 &v) const noexcept
Definition: gui_vector2.hpp:97
vector2 & operator+=(const vector2 &v) noexcept
Definition: gui_vector2.hpp:77