Thunderbots Project
Loading...
Searching...
No Matches
angle.h
1#pragma once
2
3#include <cmath>
4#include <ostream>
5
6#include "software/geom/geom_constants.h"
7
14class Angle final
15{
16 public:
20 static constexpr Angle zero();
21
25 static constexpr Angle quarter();
26
30 static constexpr Angle half();
31
35 static constexpr Angle threeQuarter();
36
40 static constexpr Angle full();
41
49 static constexpr Angle fromRadians(double rad);
50
58 static constexpr Angle fromDegrees(double deg);
59
67 static Angle asin(double x);
68
76 static Angle acos(double x);
77
85 static Angle atan(double x);
86
90 explicit constexpr Angle();
91
97 constexpr double toRadians() const;
98
104 constexpr double toDegrees() const;
105
114 constexpr Angle mod(Angle divisor) const;
115
124 constexpr Angle remainder(const Angle &divisor) const;
125
131 constexpr Angle abs() const;
132
138 bool isFinite() const;
139
145 double sin() const;
146
152 double cos() const;
153
159 double tan() const;
160
169 constexpr Angle clamp() const;
170
179 constexpr Angle minDiff(const Angle &other) const;
180
181 private:
185 double rads;
186
187 explicit constexpr Angle(double rads);
188};
189
197constexpr Angle operator-(const Angle &angle) __attribute__((warn_unused_result));
198
207constexpr Angle operator+(const Angle &x, const Angle &y)
208 __attribute__((warn_unused_result));
209
219constexpr Angle operator-(const Angle &x, const Angle &y)
220 __attribute__((warn_unused_result));
221
230constexpr Angle operator*(const Angle &angle, double scale)
231 __attribute__((warn_unused_result));
232
241constexpr Angle operator*(double scale, const Angle &angle)
242 __attribute__((warn_unused_result));
243
252constexpr Angle operator/(const Angle &angle, double divisor)
253 __attribute__((warn_unused_result));
254
263constexpr double operator/(const Angle &x, const Angle &y)
264 __attribute__((warn_unused_result));
265
274Angle &operator+=(Angle &x, const Angle &y);
275
284Angle &operator-=(Angle &x, const Angle &y);
285
294Angle &operator*=(Angle &angle, double scale);
295
305Angle &operator/=(Angle &angle, double divisor);
306
316constexpr bool operator<(const Angle &x, const Angle &y);
317
326constexpr bool operator>(const Angle &x, const Angle &y);
327
336constexpr bool operator<=(const Angle &x, const Angle &y);
337
346constexpr bool operator>=(const Angle &x, const Angle &y);
347
356bool operator==(const Angle &x, const Angle &y);
357
366constexpr bool operator!=(const Angle &x, const Angle &y);
367
376inline std::ostream &operator<<(std::ostream &os, const Angle &a);
377
378inline constexpr Angle Angle::zero()
379{
380 return Angle();
381}
382
383inline constexpr Angle Angle::quarter()
384{
385 return Angle(M_PI / 2.0);
386}
387
388inline constexpr Angle Angle::half()
389{
390 return Angle(M_PI);
391}
392
393inline constexpr Angle Angle::threeQuarter()
394{
395 return Angle(3.0 / 2.0 * M_PI);
396}
397
398inline constexpr Angle Angle::full()
399{
400 return Angle(2.0 * M_PI);
401}
402
403inline constexpr Angle Angle::fromRadians(double rad)
404{
405 return Angle(rad);
406}
407
408inline constexpr Angle Angle::fromDegrees(double deg)
409{
410 return Angle(deg / 180.0 * M_PI);
411}
412
413inline Angle Angle::asin(double x)
414{
415 return Angle::fromRadians(std::asin(x));
416}
417
418inline Angle Angle::acos(double x)
419{
420 return fromRadians(std::acos(x));
421}
422
423inline Angle Angle::atan(double x)
424{
425 return Angle::fromRadians(std::atan(x));
426}
427
428inline constexpr Angle::Angle() : rads(0.0) {}
429
430inline constexpr double Angle::toRadians() const
431{
432 return rads;
433}
434
435inline constexpr double Angle::toDegrees() const
436{
437 return rads / M_PI * 180.0;
438}
439
440inline constexpr Angle Angle::mod(Angle divisor) const
441{
442 if (divisor.toRadians() == 0)
443 {
445 }
446 else
447 {
448 return Angle::fromRadians(toRadians() - static_cast<double>(static_cast<long>(
449 toRadians() / divisor.toRadians())) *
450 divisor.toRadians());
451 }
452}
453
454inline constexpr Angle Angle::remainder(const Angle &divisor) const
455{
457 static_cast<double>(static_cast<long>(
458 (toRadians() / divisor.toRadians()) >= 0
459 ? (toRadians() / divisor.toRadians() + 0.5)
460 : (toRadians() / divisor.toRadians() - 0.5))) *
461 divisor.toRadians());
462}
463
464inline constexpr Angle Angle::abs() const
465{
466 return Angle::fromRadians(toRadians() < 0 ? -toRadians() : toRadians());
467}
468
469inline bool Angle::isFinite() const
470{
471 return std::isfinite(toRadians());
472}
473
474inline double Angle::sin() const
475{
476 return std::sin(toRadians());
477}
478
479inline double Angle::cos() const
480{
481 return std::cos(toRadians());
482}
483
484inline double Angle::tan() const
485{
486 return std::tan(toRadians());
487}
488
489inline constexpr Angle Angle::clamp() const
490{
491 return remainder(Angle::full());
492}
493
494inline constexpr Angle Angle::minDiff(const Angle &other) const
495{
496 return (*this - other).clamp().abs();
497}
498
499inline constexpr Angle::Angle(double rads) : rads(rads) {}
500
501inline constexpr Angle operator-(const Angle &angle)
502{
503 return Angle::fromRadians(-angle.toRadians());
504}
505
506inline constexpr Angle operator+(const Angle &x, const Angle &y)
507{
508 return Angle::fromRadians(x.toRadians() + y.toRadians());
509}
510
511inline constexpr Angle operator-(const Angle &x, const Angle &y)
512{
513 return Angle::fromRadians(x.toRadians() - y.toRadians());
514}
515
516inline constexpr Angle operator*(const Angle &angle, double scale)
517{
518 return Angle::fromRadians(angle.toRadians() * scale);
519}
520
521inline constexpr Angle operator*(double scale, const Angle &angle)
522{
523 return Angle::fromRadians(scale * angle.toRadians());
524}
525
526inline constexpr Angle operator/(const Angle &angle, double divisor)
527{
528 return Angle::fromRadians(angle.toRadians() / divisor);
529}
530
531inline constexpr double operator/(const Angle &x, const Angle &y)
532{
533 return x.toRadians() / y.toRadians();
534}
535
536inline Angle &operator+=(Angle &x, const Angle &y)
537{
538 return x = x + y;
539}
540
541inline Angle &operator-=(Angle &x, const Angle &y)
542{
543 return x = x - y;
544}
545
546inline Angle &operator*=(Angle &angle, double scale)
547{
548 return angle = angle * scale;
549}
550
551inline Angle &operator/=(Angle &angle, double divisor)
552{
553 return angle = angle / divisor;
554}
555
556inline constexpr bool operator<(const Angle &x, const Angle &y)
557{
558 return x.toRadians() < y.toRadians();
559}
560
561inline constexpr bool operator>(const Angle &x, const Angle &y)
562{
563 return x.toRadians() > y.toRadians();
564}
565
566inline constexpr bool operator<=(const Angle &x, const Angle &y)
567{
568 return x.toRadians() <= y.toRadians();
569}
570
571inline constexpr bool operator>=(const Angle &x, const Angle &y)
572{
573 return x.toRadians() >= y.toRadians();
574}
575
576inline bool operator==(const Angle &x, const Angle &y)
577{
578 Angle diff = x.clamp().minDiff(y.clamp());
579 return diff.toRadians() <= FIXED_EPSILON;
580}
581
582inline constexpr bool operator!=(const Angle &x, const Angle &y)
583{
584 return x.toRadians() != y.toRadians();
585}
586
587inline std::ostream &operator<<(std::ostream &os, const Angle &a)
588{
589 os << a.toRadians() << "R";
590 return os;
591}
Definition angle.h:15
static constexpr Angle threeQuarter()
Definition angle.h:393
constexpr double toDegrees() const
Definition angle.h:435
static Angle acos(double x)
Definition angle.h:418
constexpr Angle mod(Angle divisor) const
Definition angle.h:440
constexpr Angle abs() const
Definition angle.h:464
constexpr double toRadians() const
Definition angle.h:430
constexpr Angle()
Definition angle.h:428
double tan() const
Definition angle.h:484
constexpr Angle minDiff(const Angle &other) const
Definition angle.h:494
static constexpr Angle fromRadians(double rad)
Definition angle.h:403
static constexpr Angle half()
Definition angle.h:388
double sin() const
Definition angle.h:474
static constexpr Angle fromDegrees(double deg)
Definition angle.h:408
constexpr Angle clamp() const
Definition angle.h:489
static constexpr Angle full()
Definition angle.h:398
double cos() const
Definition angle.h:479
constexpr Angle remainder(const Angle &divisor) const
Definition angle.h:454
static Angle atan(double x)
Definition angle.h:423
static Angle asin(double x)
Definition angle.h:413
static constexpr Angle quarter()
Definition angle.h:383
static constexpr Angle zero()
Definition angle.h:378
bool isFinite() const
Definition angle.h:469