12#include <sleipnir/autodiff/variable.hpp>
13#include <sleipnir/util/concepts.hpp>
42 requires(!std::same_as<T, double>)
43 : m_cos{std::move(
cos)}, m_sin{std::move(
sin)} {}
51 requires std::same_as<T, double>
53 double magnitude = std::hypot(x, y);
54 if (magnitude > 1e-6) {
55 m_cos = x / magnitude;
56 m_sin = y / magnitude;
68 : m_cos{other.
cos()}, m_sin{other.
sin()} {}
85 return *
this + -other;
100 template <
typename U>
102 using R =
decltype(std::declval<T>() + std::declval<U>());
110 constexpr T
radians()
const {
return atan2(m_sin, m_cos); }
116 return atan2(m_sin, m_cos) / std::numbers::pi * 180.0;
122 constexpr const T&
cos()
const {
return m_cos; }
127 constexpr const T&
sin()
const {
return m_sin; }
136template <
typename Scalar>
139template <
typename LHS,
typename RHS>
140 requires slp::SleipnirType<LHS> && (!slp::SleipnirType<RHS>)
142 using Scalar =
typename std::decay_t<LHS>::Scalar;
144 std::vector<slp::EqualityConstraints<Scalar>> constraints;
159 constraints.emplace_back(lhs.cos() * rhs.sin() - lhs.sin() * rhs.cos() ==
164 constraints.emplace_back(lhs.cos() * lhs.cos() + lhs.sin() * lhs.sin() ==
167 return slp::EqualityConstraints{constraints};
170template <
typename LHS,
typename RHS>
171 requires(!slp::SleipnirType<LHS>) && slp::SleipnirType<RHS>
173 using Scalar =
typename std::decay_t<RHS>::Scalar;
175 std::vector<slp::EqualityConstraints<Scalar>> constraints;
190 constraints.emplace_back(lhs.cos() * rhs.sin() - lhs.sin() * rhs.cos() ==
195 constraints.emplace_back(rhs.cos() * rhs.cos() + rhs.sin() * rhs.sin() ==
198 return slp::EqualityConstraints{constraints};
201template <
typename LHS,
typename RHS>
202 requires slp::SleipnirType<LHS> && slp::SleipnirType<RHS>
204 using Scalar =
typename std::decay_t<LHS>::Scalar;
206 std::vector<slp::EqualityConstraints<Scalar>> constraints;
221 constraints.emplace_back(lhs.cos() * rhs.sin() - lhs.sin() * rhs.cos() ==
226 constraints.emplace_back(lhs.cos() * lhs.cos() + lhs.sin() * lhs.sin() ==
228 constraints.emplace_back(rhs.cos() * rhs.cos() + rhs.sin() * rhs.sin() ==
231 return slp::EqualityConstraints{constraints};
234inline bool operator==(
const Rotation2d& lhs,
const Rotation2d& rhs) {
235 return lhs.
cos() == rhs.cos() && lhs.sin() == rhs.sin();
Definition rotation2.hpp:20
constexpr T radians() const
Definition rotation2.hpp:110
constexpr T degrees() const
Definition rotation2.hpp:115
constexpr const T & cos() const
Definition rotation2.hpp:122
constexpr Rotation2< T > operator-() const
Definition rotation2.hpp:91
constexpr Rotation2(double x, double y)
Definition rotation2.hpp:50
constexpr Rotation2< U > rotate_by(const Rotation2< U > &other) const
Definition rotation2.hpp:101
constexpr Rotation2(const Rotation2< U > &other)
Definition rotation2.hpp:67
constexpr Rotation2(const T &angle)
Definition rotation2.hpp:29
constexpr Rotation2(T cos, T sin)
Definition rotation2.hpp:41
constexpr const T & sin() const
Definition rotation2.hpp:127
constexpr Rotation2()=default
Constructs a rotation with a default angle of 0 degrees.
constexpr Rotation2< T > operator-(const Rotation2< T > &other) const
Definition rotation2.hpp:84
constexpr Rotation2< T > operator+(const Rotation2< T > &other) const
Definition rotation2.hpp:75