Loading [MathJax]/extensions/tex2jax.js
LSST Applications g04a91732dc+9666464c73,g0fba68d861+079660c10e,g1fd858c14a+94f68680cf,g208c678f98+627fe8cd4e,g271391ec13+ac98094cfc,g2c84ff76c0+12036dbf49,g2c9e612ef2+a92a2e6025,g35bb328faa+fcb1d3bbc8,g4d2262a081+bcdfaf528c,g4e0f332c67+c58e4b632d,g53246c7159+fcb1d3bbc8,g60b5630c4e+a92a2e6025,g67b6fd64d1+9d1b2ab50a,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g7b71ed6315+fcb1d3bbc8,g8852436030+506db7da85,g89139ef638+9d1b2ab50a,g8d6b6b353c+a92a2e6025,g9125e01d80+fcb1d3bbc8,g989de1cb63+9d1b2ab50a,g9f33ca652e+d1749da127,ga2b97cdc51+a92a2e6025,gabe3b4be73+1e0a283bba,gb1101e3267+6ecbd0580e,gb58c049af0+f03b321e39,gb89ab40317+9d1b2ab50a,gb90eeb9370+384e1fc23b,gcf25f946ba+506db7da85,gd315a588df+382ef11c06,gd6cbbdb0b4+75aa4b1db4,gd9a9a58781+fcb1d3bbc8,gde0f65d7ad+a095917f21,ge278dab8ac+c61fbefdff,ge410e46f29+9d1b2ab50a,ge82c20c137+e12a08b75a,gf67bdafdda+9d1b2ab50a,gfd5510ef7b+df344d16e5,v29.0.0.rc2
LSST Data Management Base Package
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
LinearTransform.h
Go to the documentation of this file.
1/*
2 * Developed for the LSST Data Management System.
3 * This product includes software developed by the LSST Project
4 * (https://www.lsst.org).
5 * See the COPYRIGHT file at the top-level directory of this distribution
6 * for details of code ownership.
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
22#ifndef LSST_GEOM_LINEAR_TRANSFORM_H
23#define LSST_GEOM_LINEAR_TRANSFORM_H
24
25#include "Eigen/Core"
26#include "Eigen/Geometry"
27
29#include "lsst/geom/Point.h"
30#include "lsst/geom/Angle.h"
31
32namespace lsst {
33namespace geom {
34
35LSST_EXCEPTION_TYPE(SingularTransformException, lsst::pex::exceptions::RuntimeError,
37
38
69class LinearTransform final {
70public:
71 enum Parameters { XX = 0, YX = 1, XY = 2, YY = 3 };
72
73 typedef Eigen::Matrix<double, 4, 1> ParameterVector;
74 typedef Eigen::Matrix<double, 2, 4> TransformDerivativeMatrix;
75 typedef Eigen::Matrix<double, 4, 4> ProductDerivativeMatrix;
76
77 typedef Eigen::Matrix<double, 2, 2, Eigen::DontAlign> Matrix;
78
80 LinearTransform() noexcept : _matrix(Matrix::Identity()) {}
81
83 explicit LinearTransform(Matrix const& matrix) noexcept : _matrix(matrix) {}
84
85 // Can't use both =default and noexcept until Eigen supports noexcept
86 LinearTransform(LinearTransform const& other) noexcept : _matrix(other._matrix){};
87 LinearTransform(LinearTransform&& other) noexcept : _matrix(std::move(other._matrix)){};
88 ~LinearTransform() noexcept = default;
89
90 LinearTransform operator*(LinearTransform const& other) const noexcept {
91 return LinearTransform(getMatrix() * other.getMatrix());
92 }
93
94 static LinearTransform makeScaling(double s) noexcept {
95 return LinearTransform((Matrix() << s, 0.0, 0.0, s).finished());
96 }
97
98 static LinearTransform makeScaling(double s, double t) noexcept {
99 return LinearTransform((Matrix() << s, 0.0, 0.0, t).finished());
100 }
101
102 static LinearTransform makeRotation(Angle t) noexcept {
103 return LinearTransform(Matrix(Eigen::Rotation2D<double>(t.asRadians())));
104 }
105
106 // Can't use both =default and noexcept until Eigen supports noexcept
107 LinearTransform& operator=(LinearTransform const& other) noexcept {
108 _matrix = other._matrix;
109 return *this;
110 }
112 _matrix = std::move(other._matrix);
113 return *this;
114 }
115
117 _matrix += other._matrix;
118 return *this;
119 }
120
122 LinearTransform tmp(*this);
123 tmp += other;
124 return tmp;
125 }
126
128 _matrix -= other._matrix;
129 return *this;
130 }
131
133 LinearTransform tmp(*this);
134 tmp -= other;
135 return tmp;
136 }
137
143 ParameterVector const getParameterVector() const noexcept;
149 void setParameterVector(ParameterVector const& vector) noexcept;
150
151 Matrix const& getMatrix() const noexcept { return _matrix; }
152 Matrix& getMatrix() noexcept { return _matrix; }
153
154 double& operator[](int i) { return _matrix(i % 2, i / 2); }
155 double const& operator[](int i) const { return const_cast<Matrix&>(_matrix)(i % 2, i / 2); }
156
162 LinearTransform const inverted() const;
163
167 double computeDeterminant() const noexcept;
168
170 bool isIdentity() const noexcept { return getMatrix().isIdentity(); }
171
178 Point2D operator()(Point2D const& p) const noexcept { return Point2D(getMatrix() * p.asEigen()); }
179
186 Extent2D operator()(Extent2D const& p) const noexcept { return Extent2D(getMatrix() * p.asEigen()); }
187
189
195 double applyX(double x, double y) const noexcept { return _matrix(0, 0)*x + _matrix(0, 1)*y; }
196 double applyY(double x, double y) const noexcept { return _matrix(1, 0)*x + _matrix(1, 1)*y; }
198
202 TransformDerivativeMatrix dTransform(Point2D const& input) const noexcept;
203
205 TransformDerivativeMatrix dTransform(Extent2D const& input) const noexcept {
206 return dTransform(Point2D(input));
207 }
208
209private:
210 Matrix _matrix;
211};
212
214
215} // namespace geom
216} // namespace lsst
217
218#endif // !LSST_GEOM_LINEAR_TRANSFORM_H
#define LSST_EXCEPTION_TYPE(t, b, c)
Macro used to define new types of exceptions without additional data.
Definition Exception.h:69
A class representing an angle.
Definition Angle.h:128
A 2D linear coordinate transformation.
Point2D operator()(Point2D const &p) const noexcept
Transform a Point2D object.
Eigen::Matrix< double, 4, 4 > ProductDerivativeMatrix
LinearTransform operator+(LinearTransform const &other) noexcept
LinearTransform & operator-=(LinearTransform const &other) noexcept
Eigen::Matrix< double, 2, 2, Eigen::DontAlign > Matrix
LinearTransform(LinearTransform &&other) noexcept
double applyX(double x, double y) const noexcept
Transform a point given and returned as separate double values.
Matrix & getMatrix() noexcept
LinearTransform operator-(LinearTransform const &other) noexcept
Extent2D operator()(Extent2D const &p) const noexcept
Transform a Extent2D object.
Matrix const & getMatrix() const noexcept
static LinearTransform makeScaling(double s, double t) noexcept
static LinearTransform makeRotation(Angle t) noexcept
double applyY(double x, double y) const noexcept
static LinearTransform makeScaling(double s) noexcept
bool isIdentity() const noexcept
Whether the transform is a no-op.
~LinearTransform() noexcept=default
LinearTransform(Matrix const &matrix) noexcept
Construct an LinearTransform from an Eigen::Matrix.
LinearTransform & operator+=(LinearTransform const &other) noexcept
LinearTransform & operator=(LinearTransform &&other) noexcept
Eigen::Matrix< double, 4, 1 > ParameterVector
double const & operator[](int i) const
TransformDerivativeMatrix dTransform(Extent2D const &input) const noexcept
Derivative of (*this)(input) with respect to the transform elements (for Extent);.
LinearTransform() noexcept
Construct an empty (identity) LinearTransform.
LinearTransform(LinearTransform const &other) noexcept
TransformDerivativeMatrix dTransform(Point2D const &input) const noexcept
Derivative of (*this)(input) with respect to the transform elements (for Point).
LinearTransform & operator=(LinearTransform const &other) noexcept
Eigen::Matrix< double, 2, 4 > TransformDerivativeMatrix
T move(T... args)
Extent< double, 2 > Extent2D
Definition Extent.h:400
std::ostream & operator<<(std::ostream &os, lsst::geom::AffineTransform const &transform)
Point< double, 2 > Point2D
Definition Point.h:324