sculpto
vec2.h
Go to the documentation of this file.
1/*!****************************************************************//*!*
2 * \file vec2.h
3 * \brief Euclidean 2D vector implementation module.
4 *
5 * \author Sabitov Kirill
6 * \date 19 June 2022
7 *********************************************************************/
8
9#pragma once
10
11#include "math_common.h"
12
13/*!*
14 * 2D vector to 2 numbers convertion function.
15 *
16 * \param v - vector to convert.
17 * \return 2 numbers.
18 */
19#define SCL_VEC_XY(v) (v).GetX(), (v).GetY()
20
21namespace scl::math
22{
23 // Euclidean 2D vector class.
24 template <typename T>
25 class vec2
26 {
27 public:
29 T X { 0 }, Y { 0 };
30
31 public:
34 T SetX(T X) { this->X = X; }
36 T SetY(T Y) { this->Y = Y; }
38 T GetX() const { return X; }
40 T GetY() const { return Y; }
41
42 public:
44 vec2() = default;
45
46 /*!*
47 * Vector constructor by one scalar.
48 * All corinates would be set to its value.
49 *
50 * \param A - scalar value of all cordinates.
51 */
52 explicit vec2(T A) : X(A), Y(A) {}
53
54 /*!*
55 * Vector constructor by three coordinates.
56 *
57 * \param X, Y - coordiantes of creating vector.
58 */
59 vec2(T X, T Y) : X(X), Y(Y) {}
60
61 /*!*
62 * Vector copy constructor.
63 *
64 * \param Other - vector to copy from.
65 */
66 vec2(const vec2 &Other)
67 {
68 if (this != &Other)
69 {
70 X = Other.X;
71 Y = Other.Y;
72 }
73 }
74
75 /*!*
76 * Vector assigments operator overloading.
77 *
78 * \param Other - vector to copy from.
79 * \return self reference.
80 */
81 vec2 &operator=(const vec2 &Other)
82 {
83 if (this != &Other)
84 {
85 X = Other.X;
86 Y = Other.Y;
87 }
88 return *this;
89 }
90
91 public:
92 /*!*
93 * Vector with all components set to 0 creation function.
94 *
95 * \param None.
96 * \return zero vector.
97 */
98 static vec2 Zero() { return vec2(0); }
99
100 /*!*
101 * Vector with all components set to random value in range [Min;Max] creation function.
102 *
103 * \param min - lower bound of random number.
104 * \param Max - upper bound of random number.
105 * \return random number in range [Min; Max].
106 */
107 static vec2 Rnd(T Min = 0, T Max = 1) { return vec2(Rnd(Min, Max)); }
108
109 /*!*
110 * Vector with compund of minimums of specified vectors components.
111 *
112 * \param A, B - vectors to take minimums of components.
113 * \return minimum vector.
114 */
115 static vec2 Min(const vec2 &A, const vec2 &B) { return vec2(math::Min(A.X, B.X), math::Min(A.Y, B.Y)); }
116
117 /*!*
118 * Vector with compund of maximums of specified vectors components.
119 *
120 * \param A, B - vectors to take maximums of components.
121 * \return minimum vector.
122 */
123 static vec2 Max(const vec2 &A, const vec2 &B) { return vec2(math::Max(A.X, B.X), math::Max(A.Y, B.Y)); }
124
125 public:
126 /*!*
127 * Vector squared length getting function.
128 *
129 * \param None.
130 * \return length of vector.
131 */
132 T Length2() const
133 {
134 return X * X + Y * Y;
135 }
136
137 /*!*
138 * Vector length getting function.
139 *
140 * \param None.
141 * \return length of vector.
142 */
143 T Length() const
144 {
145 return sqrt(Length2());
146 }
147
148 /*!*
149 * Distance between two vectors getting function.
150 *
151 * \param Other - vector to get distance to.
152 * \return distance between vectors.
153 */
154 T Distacnce(const vec2 &Other) const
155 {
156 return (*this - Other).Length();
157 }
158
159 /*!*
160 * Normalized vector getting function.
161 *
162 * \param None.
163 * \return normalized vector.
164 */
166 {
167 return *this / Length();
168 }
169
170 /*!*
171 * Normalize vector function.
172 *
173 * \param None.
174 * \return normalized vector.
175 */
177 {
178 *this /= Length();
179 return *this;
180 }
181
182 /*!*
183 * Vectors dot product function.
184 *
185 * \param Other - vector to multiply
186 * \return value of vectors dot product.
187 */
188 T Dot(const vec2 &Other) const
189 {
190 return X * Other.X + Y * Other.Y;
191 }
192
193 public:
194 /*!*
195 * Vector compare function.
196 *
197 * \param Other - vector to compare with.
198 * \return is vectors equal flag.
199 */
200 bool operator==(const vec2 &Other)
201 {
202 return X == Other.X && Y == Other.Y;
203 }
204
205 /*!*
206 * Getting negative vector operation.
207 *
208 * \param None.
209 * \return negative vector.
210 */
211 const vec2 operator-() const
212 {
213 return vec2(-X, -Y);
214 }
215
216 /*!*
217 * Vectors addition operator overloading.
218 *
219 * \param Other - vector to add.
220 * \return vector with added coordinates.
221 */
222 const vec2 operator+(const vec2 &Other) const
223 {
224 return vec2(X + Other.X, Y + Other.Y);
225 }
226
227 /*!*
228 * Vectors addition with assigments operator overlaoding.
229 *
230 * \param Other - vector to add.
231 * \return self reference
232 */
233 const vec2 &operator+=(const vec2 &Other)
234 {
235 X += Other.X;
236 Y += Other.Y;
237 return *this;
238 }
239
240 /*!*
241 * Vectors addition operator overloading.
242 *
243 * \param Scalar - scalar value to add to all vetcors components
244 * \return vector with added coordinates.
245 */
246 const vec2 operator+(float Scalar) const
247 {
248 return vec2(X + Scalar, Y + Scalar);
249 }
250
251 /*!*
252 * Vectors addition with assigments operator overlaoding.
253 *
254 * \param Other - vector to add.
255 * \return self reference
256 */
257 const vec2 &operator+=(float Scalar)
258 {
259 X += Scalar;
260 Y += Scalar;
261 return *this;
262 }
263
264 /*!*
265 * Vectors subtraction operator overloading.
266 *
267 * \param Other - vector to subtract.
268 * \return vector with subtract coordinates.
269 */
270 const vec2 operator-(const vec2 &Other) const
271 {
272 return vec2(X - Other.X, Y - Other.Y);
273 }
274
275 /*!*
276 * Vectors subtraction with assigments operator overlaoding.
277 *
278 * \param Other - vector to subtract.
279 * \return self reference.
280 */
281 const vec2 &operator-=(const vec2 &Other)
282 {
283 X -= Other.X;
284 Y -= Other.Y;
285 return *this;
286 }
287
288 /*!*
289 * Vectors subtraction operator overloading.
290 *
291 * \param Scalar - scalar value to add to all vetcors components
292 * \return vector with added coordinates.
293 */
294 const vec2 operator-(float Scalar) const
295 {
296 return vec2(X - Scalar,
297 Y - Scalar);
298 }
299
300 /*!*
301 * Vectors subtraction with assigments operator overlaoding.
302 *
303 * \param Other - vector to add.
304 * \return self reference
305 */
306 const vec2 &operator-=(float Scalar)
307 {
308 X -= Scalar;
309 Y -= Scalar;
310 return *this;
311 }
312
313 /*!*
314 * Vectors multiplying operator overloading.
315 *
316 * \param Other - vector to multiply.
317 * \return vector with multiplied coordinates.
318 */
319 const vec2 operator*(const vec2 &Other) const
320 {
321 return vec2(X * Other.X, Y * Other.Y);
322 }
323
324 /*!*
325 * Vectors multiplying with assigments operator overlaoding.
326 *
327 * \param Other - vector to multiply.
328 * \return self reference.
329 */
330 const vec2 &operator*=(const vec2 &Other)
331 {
332 X *= Other.X;
333 Y *= Other.Y;
334 return *this;
335 }
336
337 /*!*
338 * Vectors multiplying operator overloading.
339 *
340 * \param Scalar - scalar value to add to all vetcors components
341 * \return vector with added coordinates.
342 */
343 const vec2 operator*(float Scalar) const
344 {
345 return vec2(X * Scalar,
346 Y * Scalar);
347 }
348
349 /*!*
350 * Vectors multiplying with assigments operator overlaoding.
351 *
352 * \param Other - vector to add.
353 * \return self reference
354 */
355 const vec2 &operator*=(float Scalar)
356 {
357 X *= Scalar;
358 Y *= Scalar;
359 return *this;
360 }
361
362 /*!*
363 * Vectors dividing operator overloading.
364 *
365 * \param Other - vector to devide.
366 * \return vector with devided coordinates.
367 */
368 const vec2 operator/(const vec2 &Other) const
369 {
370 return vec2(X / Other.X, Y / Other.Y);
371 }
372
373 /*!*
374 * Vectors dividing with assigments operator overlaoding.
375 *
376 * \param Other - vector to devide.
377 * \return self reference.
378 */
379 const vec2 &operator/=(const vec2 &Other)
380 {
381 X /= Other.X;
382 Y /= Other.Y;
383 return *this;
384 }
385
386 /*!*
387 * Vectors dividing operator overloading.
388 *
389 * \param Scalar - scalar value to add to all vetcors components
390 * \return vector with added coordinates.
391 */
392 const vec2 operator/(float Scalar) const
393 {
394 return vec2(X / Scalar,
395 Y / Scalar);
396 }
397
398 /*!*
399 * Vectors dividing with assigments operator overlaoding.
400 *
401 * \param Other - vector to add.
402 * \return self reference
403 */
404 const vec2 &operator/=(float Scalar)
405 {
406 X /= Scalar;
407 Y /= Scalar;
408 return *this;
409 }
410
411 /*!*
412 * Getting pointer to first component of vector operator.
413 * Need to pass vector to shader.
414 *
415 * \return pointer to first component of vector.
416 */
417 operator T *()
418 {
419 return &X;
420 }
421
422 /*!*
423 * Getting coordinate operator overloading.
424 *
425 * \param Index - coordinate index.
426 * \return vector cartesian coordinate.
427 */
428 T &operator [](int Index)
429 {
430 switch (Index)
431 {
432 case 0: return X;
433 default:
434 case 1: return Y;
435 }
436 }
437
438 /*!*
439 * Getting coordinate operator overloading.
440 *
441 * \param Index - coordinate index.
442 * \return vector cartesian coordinate.
443 */
444 T operator [](int Index) const
445 {
446 switch (Index)
447 {
448 case 0: return X;
449 default:
450 case 1: return Y;
451 }
452 }
453 };
454}
static vec2 Zero()
Definition: vec2.h:98
vec2(T X, T Y)
Definition: vec2.h:59
bool operator==(const vec2 &Other)
Definition: vec2.h:200
T & operator[](int Index)
Definition: vec2.h:428
const vec2 operator+(float Scalar) const
Definition: vec2.h:246
const vec2 & operator*=(float Scalar)
Definition: vec2.h:355
const vec2 operator-() const
Definition: vec2.h:211
vec2(const vec2 &Other)
Definition: vec2.h:66
const vec2 operator/(float Scalar) const
Definition: vec2.h:392
T GetX() const
Definition: vec2.h:38
vec2 & Normalize()
Definition: vec2.h:176
static vec2 Min(const vec2 &A, const vec2 &B)
Definition: vec2.h:115
const vec2 operator/(const vec2 &Other) const
Definition: vec2.h:368
vec2(T A)
Definition: vec2.h:52
T Dot(const vec2 &Other) const
Definition: vec2.h:188
const vec2 operator-(const vec2 &Other) const
Definition: vec2.h:270
const vec2 & operator-=(float Scalar)
Definition: vec2.h:306
T Length() const
Definition: vec2.h:143
T SetX(T X)
Definition: vec2.h:34
const vec2 & operator/=(float Scalar)
Definition: vec2.h:404
const vec2 operator+(const vec2 &Other) const
Definition: vec2.h:222
T Length2() const
Definition: vec2.h:132
vec2 & operator=(const vec2 &Other)
Definition: vec2.h:81
const vec2 operator-(float Scalar) const
Definition: vec2.h:294
T GetY() const
Definition: vec2.h:40
const vec2 & operator/=(const vec2 &Other)
Definition: vec2.h:379
const vec2 & operator*=(const vec2 &Other)
Definition: vec2.h:330
static vec2 Max(const vec2 &A, const vec2 &B)
Definition: vec2.h:123
const vec2 & operator+=(const vec2 &Other)
Definition: vec2.h:233
const vec2 & operator-=(const vec2 &Other)
Definition: vec2.h:281
T SetY(T Y)
Definition: vec2.h:36
const vec2 & operator+=(float Scalar)
Definition: vec2.h:257
T Distacnce(const vec2 &Other) const
Definition: vec2.h:154
const vec2 operator*(const vec2 &Other) const
Definition: vec2.h:319
static vec2 Rnd(T Min=0, T Max=1)
Definition: vec2.h:107
vec2 Normalized() const
Definition: vec2.h:165
const vec2 operator*(float Scalar) const
Definition: vec2.h:343
vec2()=default
T Max(T Num1, T Num2)
Definition: math_common.h:61
T Min(T Num1, T Num2)
Definition: math_common.h:49