3#include <frc/geometry/Rotation2d.h>
4#include <units/angle.h>
31 : m_cos(rotation.Cos()), m_sin(rotation.Sin()) {}
38 : m_cos{gcem::cos(value.template convert<units::radian>().value())},
39 m_sin{gcem::sin(value.template convert<units::radian>().value())} {}
47 double magnitude = gcem::hypot(x, y);
48 assert((magnitude > 1e-6) &&
"Cannot create CanonicalAngle with zero magnitude");
49 m_cos = x / magnitude;
50 m_sin = y / magnitude;
53 double cos()
const {
return m_cos; }
54 double sin()
const {
return m_sin; }
55 double tan()
const {
return m_sin / m_cos; }
57 units::radian_t radians()
const {
return units::radian_t{gcem::atan2(m_sin, m_cos)}; }
59 units::degree_t degrees()
const {
return radians().convert<units::degree>(); }
61 operator frc::Rotation2d()
const {
return frc::Rotation2d{m_cos, m_sin}; }
63 operator units::angle_unit
auto()
const {
return radians(); }
66 return gcem::hypot(cos() - other.cos(), sin() - other.sin()) < 1E-9;
69 bool operator!=(
const CanonicalAngle& other)
const {
return !(*
this == other); }
91 return {cos() * other.cos() - sin() * other.sin(), cos() * other.sin() + sin() * other.cos()};
110using types::CanonicalAngle;
Definition CanonicalAngle.hpp:16
CanonicalAngle(double x, double y)
Definition CanonicalAngle.hpp:46
CanonicalAngle rotateBy(const CanonicalAngle &other) const
Definition CanonicalAngle.hpp:90
bool isSupplementaryTo(const CanonicalAngle &other) const
Definition CanonicalAngle.hpp:105
CanonicalAngle(const frc::Rotation2d &rotation)
Definition CanonicalAngle.hpp:30
CanonicalAngle operator-() const
Definition CanonicalAngle.hpp:75
CanonicalAngle supplementary() const
Definition CanonicalAngle.hpp:98
CanonicalAngle(units::angle_unit auto value)
Definition CanonicalAngle.hpp:37