28 template <::sophus::concepts::EigenDenseType TPo
int>
29 using EigenConcreteType = std::decay_t<decltype(std::declval<TPoint>().eval())>;
33 template <::sophus::concepts::ScalarType TPo
int>
34 [[nodiscard]]
auto zero() -> TPoint {
38 template <::sophus::concepts::EigenDenseType TPo
int>
39 [[nodiscard]]
auto zero() -> TPoint {
40 return TPoint::Zero();
43 template <::sophus::concepts::ScalarType TPo
int>
44 auto eval(TPoint
const& p) {
48 template <::sophus::concepts::EigenDenseType TPo
int>
49 auto eval(TPoint
const& p) {
53 template <::sophus::concepts::ScalarType TPo
int>
58 template <::sophus::concepts::EigenDenseType TPo
int>
59 auto allTrue(TPoint
const& p) ->
bool {
63 template <::sophus::concepts::ScalarType TPo
int>
68 template <::sophus::concepts::EigenDenseType TPo
int>
69 auto anyTrue(TPoint
const& p) ->
bool {
73 template <::sophus::concepts::ScalarType TPo
int>
75 return std::isfinite(p);
78 template <::sophus::concepts::EigenDenseType TPo
int>
79 auto isFinite(TPoint
const& p) ->
bool {
80 return p.array().isFinite().all();
83 template <::sophus::concepts::ScalarType TPo
int>
84 auto isNan(TPoint
const& p) ->
bool {
88 template <::sophus::concepts::Po
intType TPo
int>
89 auto isNan(TPoint
const& p) ->
bool {
90 return p.array().isNaN().all();
93 template <::sophus::concepts::ScalarType TPo
int>
98 template <::sophus::concepts::EigenDenseType TPo
int>
99 auto square(TPoint
const& v) {
100 return v.squaredNorm();
103 template <::sophus::concepts::ScalarType TPo
int>
104 auto min(TPoint
const& a, TPoint
const& b) -> TPoint {
108 template <::sophus::concepts::EigenDenseType TPo
int>
109 auto min(TPoint
const& a, TPoint
const& b) -> TPoint {
110 return a.cwiseMin(b);
113 template <::sophus::concepts::ScalarType TPo
int>
114 auto max(TPoint
const& a, TPoint
const& b) -> TPoint {
118 template <::sophus::concepts::EigenDenseType TPo
int>
119 auto max(TPoint
const& a, TPoint
const& b) -> TPoint {
120 return a.cwiseMax(b);
123 template <::sophus::concepts::Po
intType TPo
int>
124 auto clamp(TPoint
const& val, TPoint
const& lo, TPoint
const& hi) -> TPoint {
128 template <::sophus::concepts::ScalarType TPo
int>
134 template <::sophus::concepts::EigenDenseType TPo
int>
135 auto floor(TPoint p) {
136 for (
auto& e : p.reshaped()) {
142 template <::sophus::concepts::ScalarType TPo
int>
148 template <::sophus::concepts::EigenDenseType TPo
int>
149 auto ceil(TPoint p) {
150 for (
auto& e : p.reshaped()) {
156 template <::sophus::concepts::ScalarType TPo
int>
162 template <::sophus::concepts::EigenDenseType TPo
int>
163 auto round(TPoint p) {
164 for (
auto& e : p.reshaped()) {
170 template <::sophus::concepts::ScalarType TPo
int>
171 [[nodiscard]]
auto plus(TPoint p, TPoint s) {
176 template <::sophus::concepts::EigenDenseType TPo
int>
177 [[nodiscard]]
auto plus(TPoint p,
typename TPoint::Scalar s) {
182 template <::sophus::concepts::ScalarType TPo
int>
183 [[nodiscard]]
auto isLessEqual(TPoint
const& lhs, TPoint
const& rhs) ->
bool {
187 template <::sophus::concepts::EigenDenseType TPo
int>
188 [[nodiscard]]
auto isLessEqual(TPoint
const& lhs, TPoint
const& rhs) ->
bool {
192 template <::sophus::concepts::ScalarType TPo
int>
193 [[nodiscard]]
auto tryGetElem(TPoint
const& p,
size_t row,
size_t col = 0)
194 -> Expected<TPoint> {
195 if (row == 0 && col == 0) {
201 template <::sophus::concepts::EigenDenseType TPo
int>
202 [[nodiscard]]
auto tryGetElem(TPoint
const& p,
size_t row,
size_t col = 0)
203 -> Expected<TPoint> {
204 if (row < p.rows() && col < p.cols()) {
208 "({}, {}) access of array of size {} x {}", row, col, p.rows(), p.cols());
211 template <::sophus::concepts::ScalarType TPo
int>
212 [[nodiscard]]
auto trySetElem(TPoint& p, TPoint s,
size_t row,
size_t col = 0)
213 -> Expected<Success> {
214 if (row == 0 && col == 0) {
221 template <::sophus::concepts::EigenDenseType TPo
int>
223 TPoint& p,
typename TPoint::Scalar s,
size_t row,
size_t col = 0)
224 -> Expected<Success> {
225 if (row == 0 && col == 0) {
232 template <::sophus::concepts::ScalarType TPo
int>
237 template <::sophus::concepts::EigenDenseType TPo
int>
239 return p.transpose();
244 template <
class TScalar,
int kDim>
245 struct PointExamples;
247 template <
class TScalar>
248 struct PointExamples<TScalar, 1> {
250 std::vector<Eigen::Vector<TScalar, 1>> point_vec;
251 point_vec.push_back(Eigen::Vector<TScalar, 1>(TScalar(1)));
252 point_vec.push_back(Eigen::Vector<TScalar, 1>(TScalar(-3)));
253 point_vec.push_back(Eigen::Vector<TScalar, 1>::Zero());
258 template <
class TScalar>
259 struct PointExamples<TScalar, 2> {
261 std::vector<Eigen::Vector<TScalar, 2>> point_vec;
262 point_vec.push_back(Eigen::Vector<TScalar, 2>(TScalar(1), TScalar(2)));
263 point_vec.push_back(Eigen::Vector<TScalar, 2>(TScalar(1), TScalar(-3)));
264 point_vec.push_back(Eigen::Vector<TScalar, 2>::Zero());
265 point_vec.push_back(Eigen::Vector<TScalar, 2>::Ones());
266 point_vec.push_back(Eigen::Vector<TScalar, 2>::UnitX());
267 point_vec.push_back(Eigen::Vector<TScalar, 2>::UnitY());
272 template <
class TScalar>
273 struct PointExamples<TScalar, 3> {
275 std::vector<Eigen::Vector<TScalar, 3>> point_vec;
277 Eigen::Vector<TScalar, 3>(TScalar(1), TScalar(2), TScalar(0.1)));
279 Eigen::Vector<TScalar, 3>(TScalar(1), TScalar(-3), TScalar(-1)));
280 point_vec.push_back(Eigen::Vector<TScalar, 3>::Zero());
281 point_vec.push_back(Eigen::Vector<TScalar, 3>::Ones());
282 point_vec.push_back(Eigen::Vector<TScalar, 3>::UnitX());
283 point_vec.push_back(Eigen::Vector<TScalar, 3>::UnitZ());
288 template <
class TScalar>
289 struct PointExamples<TScalar, 4> {
291 std::vector<Eigen::Vector<TScalar, 4>> point_vec;
292 point_vec.push_back(Eigen::Vector<TScalar, 4>(
293 TScalar(1), TScalar(2), TScalar(0.1), TScalar(0.1)));
294 point_vec.push_back(Eigen::Vector<TScalar, 4>(
295 TScalar(1), TScalar(-3), TScalar(-1), TScalar(0.1)));
296 point_vec.push_back(Eigen::Vector<TScalar, 4>::Zero());
297 point_vec.push_back(Eigen::Vector<TScalar, 4>::Ones());
298 point_vec.push_back(Eigen::Vector<TScalar, 4>::UnitX());
299 point_vec.push_back(Eigen::Vector<TScalar, 4>::UnitZ());
306 template <
class TScalar,
int kDim>
308 return details::PointExamples<TScalar, kDim>::impl();