TrajoptLib
Library for generating time-optimal trajectories for FRC robots.
Loading...
Searching...
No Matches
translation2.hpp
1// Copyright (c) TrajoptLib contributors
2
3#pragma once
4
5#include <cmath>
6#include <cstddef>
7#include <tuple>
8#include <type_traits>
9#include <utility>
10
11#include <sleipnir/autodiff/variable.hpp>
12#include <sleipnir/autodiff/variable_matrix.hpp>
13#include <sleipnir/util/concepts.hpp>
14
15#include "trajopt/geometry/rotation2.hpp"
16
17namespace trajopt {
18
20template <typename T>
22 public:
24 constexpr Translation2() = default;
25
30 template <typename X, typename Y>
31 constexpr Translation2(X x, Y y) : m_x{std::move(x)}, m_y{std::move(y)} {}
32
41 template <typename U>
43 : m_x{distance * angle.cos()}, m_y{distance * angle.sin()} {}
44
48 template <typename U>
49 constexpr explicit Translation2(const Translation2<U>& other)
50 : m_x{other.m_x}, m_y{other.m_y} {}
51
55 constexpr const T& x() const { return m_x; }
56
60 constexpr const T& y() const { return m_y; }
61
67 template <typename U>
68 constexpr auto operator+(const Translation2<U>& other) const {
69 using R = decltype(std::declval<T>() + std::declval<U>());
70 return Translation2<R>{x() + other.x(), y() + other.y()};
71 }
72
77 template <typename U>
78 constexpr auto operator-(const Translation2<U>& other) const {
79 return *this + -other;
80 }
81
88 constexpr Translation2<T> operator-() const { return {-m_x, -m_y}; }
89
95 template <typename U>
96 constexpr auto operator*(const U& scalar) const {
97 using R = decltype(std::declval<T>() + std::declval<U>());
98 return Translation2<R>{m_x * scalar, m_y * scalar};
99 }
100
106 template <typename U>
107 constexpr auto operator/(const U& scalar) const {
108 using R = decltype(std::declval<T>() + std::declval<U>());
109 return Translation2<R>{m_x / scalar, m_y / scalar};
110 }
111
116 template <typename U>
117 constexpr auto rotate_by(const Rotation2<U>& rotation) const {
118 using R = decltype(std::declval<T>() + std::declval<U>());
119 return Translation2<R>{m_x * rotation.cos() - m_y * rotation.sin(),
120 m_x * rotation.sin() + m_y * rotation.cos()};
121 }
122
126 constexpr Rotation2<T> angle() const { return Rotation2<T>{m_x, m_y}; }
127
132 template <typename U>
133 constexpr auto dot(const Translation2<U>& other) const {
134 using R = decltype(std::declval<T>() + std::declval<U>());
135 return R{m_x * other.x() + m_y * other.y()};
136 }
137
142 template <typename U>
143 constexpr auto cross(const Translation2<U>& other) const {
144 using R = decltype(std::declval<T>() + std::declval<U>());
145 return R{m_x * other.y() - m_y * other.x()};
146 }
147
152 constexpr auto norm() const { return hypot(m_x, m_y); }
153
158 constexpr auto squared_norm() const { return m_x * m_x + m_y * m_y; }
159
166 template <typename U>
167 constexpr auto distance(const Translation2<U>& other) const {
168 return hypot(other.x() - m_x, other.y() - m_y);
169 }
170
171 private:
172 T m_x{0};
173 T m_y{0};
174};
175
176template <size_t I, typename T>
177constexpr decltype(auto) get(const trajopt::Translation2<T>& translation) {
178 if constexpr (I == 0) {
179 return translation.x();
180 } else {
181 return translation.y();
182 }
183}
184
185using Translation2d = Translation2<double>;
186
187template <typename Scalar>
188using Translation2v = Translation2<slp::Variable<Scalar>>;
189
190template <typename LHS, typename RHS>
191 requires slp::SleipnirType<LHS> && (!slp::SleipnirType<RHS>)
192auto operator==(const Translation2<LHS>& lhs, const Translation2<RHS>& rhs) {
193 using Scalar = typename std::decay_t<LHS>::Scalar;
194
195 return slp::VariableMatrix<Scalar>{{lhs.x()}, {lhs.y()}} ==
196 slp::VariableMatrix<Scalar>{{rhs.x()}, {rhs.y()}};
197}
198
199template <typename LHS, typename RHS>
200 requires(!slp::SleipnirType<LHS>) || slp::SleipnirType<RHS>
201auto operator==(const Translation2<LHS>& lhs, const Translation2<RHS>& rhs) {
202 using Scalar = typename std::decay_t<RHS>::Scalar;
203
204 return slp::VariableMatrix<Scalar>{{lhs.x()}, {lhs.y()}} ==
205 slp::VariableMatrix<Scalar>{{rhs.x()}, {rhs.y()}};
206}
207
208template <typename LHS, typename RHS>
209 requires slp::SleipnirType<LHS> && slp::SleipnirType<RHS>
210auto operator==(const Translation2<LHS>& lhs, const Translation2<RHS>& rhs) {
211 using Scalar = typename std::decay_t<LHS>::Scalar;
212
213 return slp::VariableMatrix<Scalar>{{lhs.x()}, {lhs.y()}} ==
214 slp::VariableMatrix<Scalar>{{rhs.x()}, {rhs.y()}};
215}
216
217inline bool operator==(const Translation2d& lhs, const Translation2d& rhs) {
218 return lhs.x() == rhs.x() && lhs.y() == rhs.y();
219}
220
221} // namespace trajopt
222
223namespace std {
224
226template <typename T>
227struct tuple_size<trajopt::Translation2<T>>
228 : std::integral_constant<size_t, 2> {};
229
232template <typename T>
233struct tuple_element<0, trajopt::Translation2<T>> {
235 using type = T;
236};
237
240template <typename T>
241struct tuple_element<1, trajopt::Translation2<T>> {
243 using type = T;
244};
245
246} // namespace std
Definition rotation2.hpp:20
constexpr const T & cos() const
Definition rotation2.hpp:122
constexpr const T & sin() const
Definition rotation2.hpp:127
Represents a translation in 2D space.
Definition translation2.hpp:21
constexpr Translation2< T > operator-() const
Definition translation2.hpp:88
constexpr auto distance(const Translation2< U > &other) const
Definition translation2.hpp:167
constexpr auto dot(const Translation2< U > &other) const
Definition translation2.hpp:133
constexpr auto operator/(const U &scalar) const
Definition translation2.hpp:107
constexpr Translation2(const Translation2< U > &other)
Definition translation2.hpp:49
constexpr auto norm() const
Definition translation2.hpp:152
constexpr auto operator*(const U &scalar) const
Definition translation2.hpp:96
constexpr const double & y() const
Definition translation2.hpp:60
constexpr auto rotate_by(const Rotation2< U > &rotation) const
Definition translation2.hpp:117
constexpr auto squared_norm() const
Definition translation2.hpp:158
constexpr Translation2(T distance, const Rotation2< U > &angle)
Definition translation2.hpp:42
constexpr auto cross(const Translation2< U > &other) const
Definition translation2.hpp:143
constexpr Translation2(X x, Y y)
Definition translation2.hpp:31
constexpr Rotation2< double > angle() const
Definition translation2.hpp:126
constexpr auto operator+(const Translation2< U > &other) const
Definition translation2.hpp:68
constexpr auto operator-(const Translation2< U > &other) const
Definition translation2.hpp:78
constexpr const double & x() const
Definition translation2.hpp:55
constexpr Translation2()=default
Constructs a translation with x and y components equal to zero.
T type
tuple_element typedef for first element of translation.
Definition translation2.hpp:235
T type
Tuple element typedef for first element of translation.
Definition translation2.hpp:243