farm-ng-core
similarity2.h
Go to the documentation of this file.
1 // Copyright (c) 2011, Hauke Strasdat
2 // Copyright (c) 2012, Steven Lovegrove
3 // Copyright (c) 2021, farm-ng, inc.
4 //
5 // Use of this source code is governed by an MIT-style
6 // license that can be found in the LICENSE file or at
7 // https://opensource.org/licenses/MIT.
8 
9 #pragma once
10 
14 #include "sophus/lie/isometry2.h"
15 #include "sophus/lie/lie_group.h"
17 
18 namespace sophus {
19 
20 // origin, coordinate axis directions, and shape preserving mapping
21 template <class TScalar>
22 class Similarity2 : public lie::Group<
23  Similarity2,
24  TScalar,
25  lie::WithDimAndSubgroup<2, lie::SpiralSimilarity2Impl>::
26  SemiDirectProduct> {
27  public:
28  using Scalar = TScalar;
29  using Base = lie::Group<
31  TScalar,
33  SemiDirectProduct>;
37 
38  using Tangent = typename Base::Tangent;
39  using Params = typename Base::Params;
40  using Point = typename Base::Point;
41 
42  Similarity2() = default;
43 
44  explicit Similarity2(UninitTag /*unused*/) {}
45 
47  Eigen::Vector<Scalar, 2> const& translation,
48  SpiralSimilarity const& scaled_rotation)
49  : Similarity2(UninitTag{}) {
50  this->params_.template head<2>() = scaled_rotation.params();
51  this->params_.template tail<2>() = translation;
52  }
53 
55  : Similarity2(Eigen::Vector<Scalar, 2>::Zero(), rotation) {}
56 
57  Similarity2(SpiralSimilarity const& scaled_rotation)
58  : Similarity2(Eigen::Vector<Scalar, 2>::Zero(), scaled_rotation) {}
59 
60  Similarity2(Isometry const& isometry)
61  : Similarity2(isometry.translation(), isometry.rotation()) {}
62 
64  Eigen::Vector<Scalar, 2> const& translation, Rotation const& rotation)
66 
68  Eigen::Vector<Scalar, 2> const& translation,
69  Rotation const& rotation,
70  Scalar scale)
72 
74  : Similarity2(Eigen::Vector<Scalar, 2>::Zero(), rotation, scale) {}
75 
76  Similarity2(Eigen::Vector<Scalar, 2> const& translation)
78 
79  static auto fromScale(Scalar const& scale) -> Similarity2 {
80  return Similarity2(Rotation{}, scale);
81  }
82 
83  static auto fromAngle(Scalar const& theta) -> Similarity2 {
84  return Similarity2(Rotation(theta));
85  }
86 
87  /// Construct a translation only Isometry3 instance.
88  ///
89  template <class TT0, class TT1>
90  static auto fromT(TT0 const& x, TT1 const& y) -> Similarity2 {
91  return Similarity2(Eigen::Vector2<Scalar>(x, y));
92  }
93 
94  /// Construct x-axis translation.
95  ///
96  static auto fromTx(Scalar const& x) -> Similarity2 {
97  return Similarity2::fromT(x, Scalar(0));
98  }
99 
100  /// Construct y-axis translation.
101  ///
102  static auto fromTy(Scalar const& y) -> Similarity2 {
103  return Similarity2::fromT(Scalar(0), y);
104  }
105 
106  static auto fromRotationMatrix(Eigen::Matrix2<Scalar> const& mat_r)
107  -> Similarity2 {
109  }
110 
111  static auto fromComplex(Complex<Scalar> const& z) -> Similarity2 {
113  }
114 
115  template <class TOtherScalar>
116  auto cast() const -> Similarity2<TOtherScalar> {
118  this->params_.template cast<TOtherScalar>());
119  }
120 
121  auto translation() -> Eigen::VectorBlock<Params, 2> {
122  return this->params_.template tail<2>();
123  }
124 
125  [[nodiscard]] auto translation() const
126  -> Eigen::VectorBlock<Params const, 2> {
127  return this->params_.template tail<2>();
128  }
129 
130  [[nodiscard]] auto rotation() const {
131  return this->spiralSimilarity().rotation();
132  }
133 
134  void setRotation(Rotation const& rotation) { this->rotation() = rotation; }
135 
136  [[nodiscard]] auto rotationMatrix() const -> Eigen::Matrix2<Scalar> {
137  return this->rotation().matrix();
138  }
139 
140  [[nodiscard]] auto spiralSimilarity() const {
142  this->params_.template head<SpiralSimilarity2<Scalar>::kNumParams>());
143  }
144 
146  this->params_.template head<SpiralSimilarity2<Scalar>::kNumParams>() =
147  rotation.params();
148  }
149 
150  [[nodiscard]] auto scale() const -> Scalar {
151  return this->spiralSimilarity().scale();
152  }
153 
156  s.setScale(scale);
157  this->setSpiralSimilarity(s);
158  }
159 
160  [[nodiscard]] auto angle() const -> Scalar {
161  return this->rotation().angle();
162  }
163 
164  auto setComplex(Complex<Scalar> const& z) const -> void {
166  }
167 
168  [[nodiscard]] auto complex() const -> Complex<Scalar> {
169  return this->spiralSimilarity().complex();
170  }
171 };
172 
175 
176 static_assert(concepts::Similarity2<Similarity2F64>);
177 
178 } // namespace sophus
sophus::Similarity2
Definition: similarity2.h:22
sophus::lie::Group< Similarity2, TScalar, lie::WithDimAndSubgroup< 2, lie::SpiralSimilarity2Impl >::SemiDirectProduct >::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: lie_group.h:69
sophus::Similarity2::Similarity2
Similarity2(SpiralSimilarity const &scaled_rotation)
Definition: similarity2.h:57
Eigen
Definition: params.h:72
sophus::lie::Group< Similarity2, TScalar, lie::WithDimAndSubgroup< 2, lie::SpiralSimilarity2Impl >::SemiDirectProduct >::Tangent
Eigen::Vector< Scalar, kDof > Tangent
Definition: lie_group.h:68
sophus::Rotation2::fromRotationMatrix
static auto fromRotationMatrix(Eigen::Matrix2< TScalar > const &mat_r) -> Rotation2
Definition: rotation2.h:46
sophus::Similarity2::fromTy
static auto fromTy(Scalar const &y) -> Similarity2
Construct y-axis translation.
Definition: similarity2.h:102
sophus::lie::Group
Definition: lie_group.h:24
sophus::SpiralSimilarity2::fromComplex
static auto fromComplex(Complex< Scalar > const &z) -> SpiralSimilarity2
Definition: spiral_similarity2.h:42
sophus::Similarity2::Similarity2
Similarity2(Isometry const &isometry)
Definition: similarity2.h:60
sophus::Similarity2::Tangent
typename Base::Tangent Tangent
Definition: similarity2.h:38
sophus::Similarity2::fromRotationMatrix
static auto fromRotationMatrix(Eigen::Matrix2< Scalar > const &mat_r) -> Similarity2
Definition: similarity2.h:106
sophus::Similarity2::Scalar
TScalar Scalar
Definition: similarity2.h:28
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::lie::Group< Similarity2, TScalar, lie::WithDimAndSubgroup< 2, lie::SpiralSimilarity2Impl >::SemiDirectProduct >::Point
Eigen::Vector< Scalar, kPointDim > Point
Definition: lie_group.h:70
spiral_similarity2.h
sophus::Similarity2::translation
auto translation() -> Eigen::VectorBlock< Params, 2 >
Definition: similarity2.h:121
sophus::Similarity2::setRotation
void setRotation(Rotation const &rotation)
Definition: similarity2.h:134
sophus::Similarity2::fromScale
static auto fromScale(Scalar const &scale) -> Similarity2
Definition: similarity2.h:79
sophus::lie::Group< Similarity2, TScalar, lie::WithDimAndSubgroup< 2, lie::SpiralSimilarity2Impl >::SemiDirectProduct >::fromParams
static auto fromParams(Params const &params) -> Derived
Definition: lie_group.h:79
sophus::Similarity2::rotation
auto rotation() const
Definition: similarity2.h:130
sophus::Similarity2::fromT
static auto fromT(TT0 const &x, TT1 const &y) -> Similarity2
Construct a translation only Isometry3 instance.
Definition: similarity2.h:90
sophus::Similarity2::spiralSimilarity
auto spiralSimilarity() const
Definition: similarity2.h:140
sophus::lie::Group< Similarity2, TScalar, lie::WithDimAndSubgroup< 2, lie::SpiralSimilarity2Impl >::SemiDirectProduct >::params_
Params params_
Definition: lie_group.h:265
sophus::Similarity2::setComplex
auto setComplex(Complex< Scalar > const &z) const -> void
Definition: similarity2.h:164
sophus::Similarity2::fromTx
static auto fromTx(Scalar const &x) -> Similarity2
Construct x-axis translation.
Definition: similarity2.h:96
sophus::Similarity2::Similarity2
Similarity2(Eigen::Vector< Scalar, 2 > const &translation, SpiralSimilarity const &scaled_rotation)
Definition: similarity2.h:46
sophus::Similarity2::Similarity2
Similarity2(Eigen::Vector< Scalar, 2 > const &translation, Rotation const &rotation, Scalar scale)
Definition: similarity2.h:67
isometry2.h
sophus::Similarity2::Rotation
Rotation2< Scalar > Rotation
Definition: similarity2.h:34
sophus::lie::WithDimAndSubgroup
Definition: translation_factor_group_product.h:380
sophus::Similarity2::angle
auto angle() const -> Scalar
Definition: similarity2.h:160
sophus::Similarity2::fromComplex
static auto fromComplex(Complex< Scalar > const &z) -> Similarity2
Definition: similarity2.h:111
sophus::Similarity2::Similarity2
Similarity2(Rotation const &rotation)
Definition: similarity2.h:54
sophus::Isometry2
Definition: isometry2.h:22
sophus::Similarity2::complex
auto complex() const -> Complex< Scalar >
Definition: similarity2.h:168
sophus::SpiralSimilarity2
Definition: spiral_similarity2.h:20
sophus::SpiralSimilarity2::setScale
void setScale(Scalar scale)
Definition: spiral_similarity2.h:81
sophus::Similarity2::Similarity2
Similarity2(Rotation const &rotation, Scalar scale)
Definition: similarity2.h:73
spiral_similarity2.h
lie_group.h
sophus::Similarity2::fromAngle
static auto fromAngle(Scalar const &theta) -> Similarity2
Definition: similarity2.h:83
sophus::Similarity2::rotationMatrix
auto rotationMatrix() const -> Eigen::Matrix2< Scalar >
Definition: similarity2.h:136
sophus::Similarity2::Point
typename Base::Point Point
Definition: similarity2.h:40
sophus::Similarity2::Params
typename Base::Params Params
Definition: similarity2.h:39
group_accessors.h
translation_factor_group_product.h
sophus::Similarity2::scale
auto scale() const -> Scalar
Definition: similarity2.h:150
sophus::Similarity2::Similarity2
Similarity2()=default
sophus::Similarity2::Similarity2
Similarity2(Eigen::Vector< Scalar, 2 > const &translation)
Definition: similarity2.h:76
sophus::Similarity2::setScale
void setScale(Scalar scale)
Definition: similarity2.h:154
sophus::Rotation2
Definition: rotation2.h:20
sophus::Similarity2::cast
auto cast() const -> Similarity2< TOtherScalar >
Definition: similarity2.h:116
sophus::Similarity2::Similarity2
Similarity2(UninitTag)
Definition: similarity2.h:44
sophus::Similarity2::translation
auto translation() const -> Eigen::VectorBlock< Params const, 2 >
Definition: similarity2.h:125
sophus::Similarity2::Similarity2
Similarity2(Eigen::Vector< Scalar, 2 > const &translation, Rotation const &rotation)
Definition: similarity2.h:63
sophus::Similarity2::setSpiralSimilarity
auto setSpiralSimilarity(SpiralSimilarity2< Scalar > const &rotation)
Definition: similarity2.h:145
sophus::Complex
Definition: group_accessors.h:15
sophus::UninitTag
Definition: common.h:70