MathLib
Loading...
Searching...
No Matches
Angle.hpp
Go to the documentation of this file.
1#pragma once
2
4#include <cmath>
5#include <concepts>
6#include <compare>
7
15namespace Math
16{
17
27template <std::floating_point T>
29{
30public:
34 using value_type = T;
36
40 constexpr BasicRadian() = default;
41 constexpr BasicRadian(T value) : _value(value) { }
43
47 static constexpr BasicRadian<T> zero() { return BasicRadian<T>(); }
49
53 T value() const { return _value; }
55
59 constexpr BasicRadian<T> &operator +=(const BasicRadian &other)
60 {
61 _value += other._value;
62 return *this;
63 }
64
65 constexpr BasicRadian<T> &operator -=(const BasicRadian &other)
66 {
67 _value -= other._value;
68 return *this;
69 }
70
71 constexpr BasicRadian<T> &operator *=(const BasicRadian &other)
72 {
73 _value *= other._value;
74 return *this;
75 }
76
77 constexpr BasicRadian<T> &operator /=(const BasicRadian &other)
78 {
79 _value /= other._value;
80 return *this;
81 }
82
83 constexpr BasicRadian<T> &operator /=(const T &other)
84 {
85 _value /= other;
86 return *this;
87 }
89
98 friend constexpr auto operator <=>(const BasicRadian<T> &left, const BasicRadian<T> &right) = default;
100
104 constexpr bool isNaN() const
105 {
106 return std::isnan(_value);
107 }
108
109 constexpr bool isInf() const
110 {
111 return std::isinf(_value);
112 }
114
115private:
116 T _value{};
117
134 friend constexpr bool approximately_equal_to(const BasicRadian<T> &value_to_test,
135 const BasicRadian<T> &value_it_should_be,
136 T tolerance = T{0.0002})
137 {
138 return approximately_equal_to(value_to_test.value(), value_it_should_be.value(), tolerance);
139 }
141
148 friend constexpr BasicRadian<T> operator +(const BasicRadian<T> &left, const BasicRadian<T> &right)
149 {
150 return BasicRadian<T>{ left.value() + right.value() };
151 }
152
153 friend constexpr BasicRadian<T> operator -(const BasicRadian<T> &left, const BasicRadian<T> &right)
154 {
155 return BasicRadian<T>{ left.value() - right.value() };
156 }
157
158 friend constexpr BasicRadian<T> operator *(const BasicRadian<T> &left, const BasicRadian<T> &right)
159 {
160 return BasicRadian<T>{ left.value() * right.value() };
161 }
162
163 friend constexpr BasicRadian<T> operator /(const BasicRadian<T> &left, const BasicRadian<T> &right)
164 {
165 return BasicRadian<T>{ left.value() / right.value() };
166 }
167
168 friend constexpr BasicRadian<T> operator -(const BasicRadian<T> &input)
169 {
170 return BasicRadian{ -input.value() };
171 }
173
180 {
181 return std::sin( i.value() );
182 }
183
185 {
186 return std::cos( i.value() );
187 }
188
190 {
191 return std::tan( i.asStdComplex() );
192 }
193
195 {
196 return std::asin( i.asStdComplex() );
197 }
198
200 {
201 return std::acos( i.asStdComplex() );
202 }
203
205 {
206 return std::atan( i.asStdComplex() );
207 }
208
210 {
211 return std::sinh( i.asStdComplex() );
212 }
213
215 {
216 return std::cosh( i.asStdComplex() );
217 }
218
220 {
221 return std::tanh( i.asStdComplex() );
222 }
223
225 {
226 return std::asinh( i.asStdComplex() );
227 }
228
230 {
231 return std::acosh( i.asStdComplex() );
232 }
233
235 {
236 return std::atanh( i.asStdComplex() );
237 }
238
240 {
241 return std::atan2( y.value(), x.value() );
242 }
244};
245
246
260template <std::floating_point T>
262{
263public:
267 using value_type = T;
269
273 constexpr BasicDegree() = default;
274 constexpr BasicDegree(T value) : _value(value) { }
275 constexpr BasicDegree(const BasicRadian<T> &value) : _value( RadiansToDegrees(value.value()) ) { }
277
281 operator BasicRadian<T>() const { return BasicRadian<T>{ DegreesToRadians(_value) }; }
283
287 static constexpr BasicDegree<T> zero() { return BasicDegree<T>(); }
289
293 T value() const { return _value; }
295
300 {
301 _value += other.value();
302 return *this;
303 }
304
305 constexpr BasicDegree<T> &operator +=(const T &other)
306 {
307 _value += other;
308 return *this;
309 }
310
312 {
313 _value -= other.value();
314 return *this;
315 }
316
317 constexpr BasicDegree<T> &operator -=(const T &other)
318 {
319 _value -= other;
320 return *this;
321 }
322
324 {
325 _value *= other.value();
326 return *this;
327 }
328
329 constexpr BasicDegree<T> &operator *=(const T &other)
330 {
331 _value *= other;
332 return *this;
333 }
334
336 {
337 _value /= other.value();
338 return *this;
339 }
340
341 constexpr BasicDegree<T> &operator /=(const T &other)
342 {
343 _value /= other;
344 return *this;
345 }
347
358 friend constexpr auto operator <=>(const BasicDegree<T> &left, const BasicDegree<T> &right) = default;
361
362 static constexpr T modulus() { return 360; }
363 constexpr BasicDegree<T> modulo() const
364 {
365 T modded;
366
367 // Make in range of 0 - 360
368 return BasicDegree<T>{ (0.0 <= (modded = std::fmod( _value, modulus() )) ? modded : modulus() + modded) };
369 }
370
374 constexpr bool isNaN() const
375 {
376 return std::isnan(_value);
377 }
378
379 constexpr bool isInf() const
380 {
381 return std::isinf(_value);
382 }
384
385private:
386 T _value{};
387
404 friend constexpr bool approximately_equal_to(const BasicDegree<T> &value_to_test,
405 const BasicDegree<T> &value_it_should_be,
406 T tolerance = T{0.0002})
407 {
408 return approximately_equal_to(value_to_test.value(), value_it_should_be.value(), tolerance);
409 }
411
418 friend constexpr BasicDegree<T> operator +(const BasicDegree<T> &left, const BasicDegree<T> &right)
419 {
420 return { left.value() + right.value() };
421 }
422
423 friend constexpr BasicDegree<T> operator -(const BasicDegree<T> &left, const BasicDegree<T> &right)
424 {
425 return { left.value() - right.value() };
426 }
427
428 friend constexpr BasicDegree<T> operator *(const BasicDegree<T> &left, const BasicDegree<T> &right)
429 {
430 return { left.value() * right.value() };
431 }
432
433 friend constexpr BasicDegree<T> operator /(const BasicDegree<T> &left, const BasicDegree<T> &right)
434 {
435 return { left.value() / right.value() };
436 }
437
438 friend constexpr BasicDegree<T> operator +(const BasicDegree<T> &left, const T &right)
439 {
440 return { left.value() + right };
441 }
442
443 friend constexpr BasicDegree<T> operator -(const BasicDegree<T> &left, const T &right)
444 {
445 return { left.value() - right };
446 }
447
448 friend constexpr BasicDegree<T> operator *(const BasicDegree<T> left, const T &right)
449 {
450 return { left.value() * right };
451 }
452
453 friend constexpr BasicDegree<T> operator /(const BasicDegree<T> &left, const T &right)
454 {
455 return { left.value() / right };
456 }
457
458 friend constexpr BasicDegree<T> operator -(const BasicDegree<T> &input)
459 {
460 return { -input.value() };
461 }
463};
464
465
466namespace Literals
467{
468
482constexpr BasicDegree<float> operator ""_deg_f(long double degrees)
483{
484 return BasicDegree<float>{ static_cast<float>(degrees) };
485}
486
487constexpr BasicDegree<float> operator ""_deg_F(long double degrees)
488{
489 return BasicDegree<float>{ static_cast<float>(degrees) };
490}
491
492constexpr BasicDegree<float> operator ""_degf(long double degrees)
493{
494 return BasicDegree<float>{ static_cast<float>(degrees) };
495}
496
497constexpr BasicDegree<float> operator ""_degF(long double degrees)
498{
499 return BasicDegree<float>{ static_cast<float>(degrees) };
500}
501
502constexpr BasicDegree<double> operator ""_deg(long double degrees)
503{
504 return BasicDegree<double>{ static_cast<double>(degrees) };
505}
506
507constexpr BasicDegree<long double> operator ""_deg_l(long double degrees)
508{
509 return BasicDegree<long double>{degrees};
510}
511
512constexpr BasicDegree<long double> operator ""_deg_L(long double degrees)
513{
514 return BasicDegree<long double>{degrees};
515}
516
517constexpr BasicDegree<long double> operator ""_degl(long double degrees)
518{
519 return BasicDegree<long double>{degrees};
520}
521
522constexpr BasicDegree<long double> operator ""_degL(long double degrees)
523{
524 return BasicDegree<long double>{degrees};
525}
528
529}
530
531namespace Literals
532{
533
547constexpr BasicRadian<float> operator ""_rad_f(long double radians)
548{
549 return BasicRadian<float>{ static_cast<float>(radians) };
550}
551
552constexpr BasicRadian<float> operator ""_rad_F(long double radians)
553{
554 return BasicRadian<float>{ static_cast<float>(radians) };
555}
556
557constexpr BasicRadian<float> operator ""_radf(long double radians)
558{
559 return BasicRadian<float>{ static_cast<float>(radians) };
560}
561
562constexpr BasicRadian<float> operator ""_radF(long double radians)
563{
564 return BasicRadian<float>{ static_cast<float>(radians) };
565}
566
567constexpr BasicRadian<double> operator ""_rad(long double radians)
568{
569 return BasicRadian<double>{ static_cast<double>(radians) };
570}
571
572constexpr BasicRadian<long double> operator ""_rad_l(long double radians)
573{
574 return BasicRadian<long double>{radians};
575}
576
577constexpr BasicRadian<long double> operator ""_rad_L(long double radians)
578{
579 return BasicRadian<long double>{radians};
580}
581
582constexpr BasicRadian<long double> operator ""_radl(long double radians)
583{
584 return BasicRadian<long double>{radians};
585}
586
587constexpr BasicRadian<long double> operator ""_radL(long double radians)
588{
589 return BasicRadian<long double>{radians};
590}
593
594}
595
614
633
634}
static constexpr T modulus()
Definition Angle.hpp:362
constexpr BasicDegree()=default
Defaults to 0.
constexpr BasicDegree< T > & operator+=(const BasicDegree< T > &other)
Definition Angle.hpp:299
constexpr BasicDegree< T > & operator*=(const BasicDegree< T > &other)
Definition Angle.hpp:323
constexpr bool isInf() const
Definition Angle.hpp:379
friend constexpr BasicDegree< T > operator/(const BasicDegree< T > &left, const BasicDegree< T > &right)
Definition Angle.hpp:433
constexpr BasicDegree< T > & operator-=(const BasicDegree< T > &other)
Definition Angle.hpp:311
friend constexpr BasicDegree< T > operator+(const BasicDegree< T > &left, const BasicDegree< T > &right)
Definition Angle.hpp:418
static constexpr BasicDegree< T > zero()
Definition Angle.hpp:287
friend constexpr BasicDegree< T > operator-(const BasicDegree< T > &left, const BasicDegree< T > &right)
Definition Angle.hpp:423
constexpr BasicDegree(T value)
Definition Angle.hpp:274
constexpr BasicDegree< T > & operator/=(const BasicDegree< T > &other)
Definition Angle.hpp:335
friend constexpr BasicDegree< T > operator*(const BasicDegree< T > &left, const BasicDegree< T > &right)
Definition Angle.hpp:428
constexpr BasicDegree< T > modulo() const
Definition Angle.hpp:363
T value() const
Definition Angle.hpp:293
friend constexpr auto operator<=>(const BasicDegree< T > &left, const BasicDegree< T > &right)=default
constexpr BasicDegree(const BasicRadian< T > &value)
Definition Angle.hpp:275
constexpr bool isNaN() const
Definition Angle.hpp:374
T value_type
The underlying implementation type.
Definition Angle.hpp:267
friend constexpr BasicRadian< T > operator-(const BasicRadian< T > &left, const BasicRadian< T > &right)
Definition Angle.hpp:153
constexpr BasicRadian()=default
Defaults to 0.
friend BasicRadian< T > atanh(BasicRadian< T > i)
Definition Angle.hpp:234
static constexpr BasicRadian< T > zero()
Definition Angle.hpp:47
friend BasicRadian< T > cos(BasicRadian< T > i)
Definition Angle.hpp:184
friend BasicRadian< T > asinh(BasicRadian< T > i)
Definition Angle.hpp:224
friend constexpr BasicRadian< T > operator/(const BasicRadian< T > &left, const BasicRadian< T > &right)
Definition Angle.hpp:163
constexpr BasicRadian< T > & operator-=(const BasicRadian &other)
Definition Angle.hpp:65
friend constexpr auto operator<=>(const BasicRadian< T > &left, const BasicRadian< T > &right)=default
constexpr bool isInf() const
Definition Angle.hpp:109
friend BasicRadian< T > sin(BasicRadian< T > i)
Definition Angle.hpp:179
friend BasicRadian< T > cosh(BasicRadian< T > i)
Definition Angle.hpp:214
constexpr BasicRadian< T > & operator*=(const BasicRadian &other)
Definition Angle.hpp:71
friend BasicRadian< T > atan2(BasicRadian< T > y, BasicRadian< T > x)
Definition Angle.hpp:239
friend BasicRadian< T > sinh(BasicRadian< T > i)
Definition Angle.hpp:209
friend BasicRadian< T > tan(BasicRadian< T > i)
Definition Angle.hpp:189
friend BasicRadian< T > acosh(BasicRadian< T > i)
Definition Angle.hpp:229
T value() const
Definition Angle.hpp:53
friend BasicRadian< T > asin(BasicRadian< T > i)
Definition Angle.hpp:194
constexpr BasicRadian< T > & operator+=(const BasicRadian &other)
Definition Angle.hpp:59
friend BasicRadian< T > atan(BasicRadian< T > i)
Definition Angle.hpp:204
constexpr BasicRadian(T value)
Definition Angle.hpp:41
friend BasicRadian< T > tanh(BasicRadian< T > i)
Definition Angle.hpp:219
friend constexpr BasicRadian< T > operator+(const BasicRadian< T > &left, const BasicRadian< T > &right)
Definition Angle.hpp:148
constexpr bool isNaN() const
Definition Angle.hpp:104
friend constexpr BasicRadian< T > operator*(const BasicRadian< T > &left, const BasicRadian< T > &right)
Definition Angle.hpp:158
constexpr BasicRadian< T > & operator/=(const BasicRadian &other)
Definition Angle.hpp:77
T value_type
The underlying implementation type.
Definition Angle.hpp:34
friend BasicRadian< T > acos(BasicRadian< T > i)
Definition Angle.hpp:199
constexpr T DegreesToRadians(T degrees)
Convert degrees to radians.
constexpr T RadiansToDegrees(T radians)
Convert radians to degrees.
friend constexpr bool approximately_equal_to(const BasicRadian< T > &value_to_test, const BasicRadian< T > &value_it_should_be, T tolerance=T{0.0002})
Definition Angle.hpp:134
friend constexpr bool approximately_equal_to(const BasicDegree< T > &value_to_test, const BasicDegree< T > &value_it_should_be, T tolerance=T{0.0002})
Definition Angle.hpp:404
Definition Angle.hpp:16