LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
AffineTransform.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_AFFINE_TRANSFORM_H
23#define LSST_GEOM_AFFINE_TRANSFORM_H
24
25#include <memory>
26#include <iostream>
27
28#include "Eigen/Core"
29
30#include "lsst/geom/Point.h"
31#include "lsst/geom/Extent.h"
33#include "lsst/geom/Angle.h"
34
35namespace lsst {
36namespace geom {
37
75class AffineTransform final {
76public:
77 enum Parameters { XX = 0, YX = 1, XY = 2, YY = 3, X = 4, Y = 5 };
78
79 typedef Eigen::Matrix3d Matrix;
80 typedef Eigen::Matrix<double, 6, 1> ParameterVector;
81 typedef Eigen::Matrix<double, 2, 6> TransformDerivativeMatrix;
82
84 AffineTransform() noexcept : _linear(), _translation() {}
85
87 explicit AffineTransform(Eigen::Matrix3d const &matrix) noexcept
88 : _linear(matrix.block<2, 2>(0, 0)), _translation(matrix.block<2, 1>(0, 2)) {}
89
91 explicit AffineTransform(Eigen::Matrix2d const &linear) noexcept : _linear(linear), _translation() {}
92
94 explicit AffineTransform(Eigen::Vector2d const &translation) noexcept
95 : _linear(), _translation(translation) {}
96
98 explicit AffineTransform(Eigen::Matrix2d const &linear, Eigen::Vector2d const &translation) noexcept
99 : _linear(linear), _translation(translation) {}
100
102 AffineTransform(LinearTransform const &linear) noexcept : _linear(linear), _translation() {}
103
105 explicit AffineTransform(Extent2D const &translation) noexcept : _linear(), _translation(translation) {}
106
108 explicit AffineTransform(LinearTransform const &linear, Extent2D const &translation) noexcept
109 : _linear(linear), _translation(translation) {}
110
111 AffineTransform(AffineTransform const &) noexcept = default;
112 AffineTransform(AffineTransform &&) noexcept = default;
113 ~AffineTransform() noexcept = default;
114
116
121 AffineTransform const inverted() const;
123
125 bool isIdentity() const noexcept { return getMatrix().isIdentity(); }
126
132 Point2D operator()(Point2D const &p) const noexcept { return Point2D(_linear(p) + _translation); }
133
139 Extent2D operator()(Extent2D const &p) const noexcept { return Extent2D(_linear(p)); }
140
142
148 double applyX(double x, double y) const noexcept { return _linear.applyX(x, y) + _translation.getX(); }
149 double applyY(double x, double y) const noexcept { return _linear.applyY(x, y) + _translation.getY(); }
151
152 Extent2D const &getTranslation() const noexcept { return _translation; }
153 Extent2D &getTranslation() noexcept { return _translation; }
154
155 LinearTransform const &getLinear() const noexcept { return _linear; }
156 LinearTransform &getLinear() noexcept { return _linear; }
157
161 Matrix const getMatrix() const noexcept;
162
168 ParameterVector const getParameterVector() const noexcept;
174 void setParameterVector(ParameterVector const &vector) noexcept;
175
176 double &operator[](int i) { return (i < 4) ? _linear[i] : _translation[i - 4]; }
177 double operator[](int i) const { return (i < 4) ? _linear[i] : _translation[i - 4]; }
178
182 AffineTransform operator*(AffineTransform const &other) const noexcept {
183 return AffineTransform(getLinear() * other.getLinear(),
184 getLinear()(other.getTranslation()) + getTranslation());
185 }
186
187 AffineTransform &operator=(AffineTransform const &) noexcept = default;
189
190 AffineTransform &operator+=(AffineTransform const &other) noexcept {
191 _linear += other._linear;
192 _translation += other._translation;
193 return *this;
194 }
195
197 AffineTransform tmp(*this);
198 tmp += other;
199 return tmp;
200 }
201
203 _linear -= other._linear;
204 _translation -= other._translation;
205 return *this;
206 }
207
209 AffineTransform tmp(*this);
210 tmp -= other;
211 return tmp;
212 }
213
226 static AffineTransform makeScaling(double s) noexcept {
228 }
229
243 static AffineTransform makeScaling(double s, double t) noexcept {
245 }
258 static AffineTransform makeRotation(Angle t) noexcept {
260 }
261
274 static AffineTransform makeTranslation(Extent2D translation) noexcept {
275 return AffineTransform(translation);
276 }
277
281 TransformDerivativeMatrix dTransform(Point2D const &input) const noexcept;
285 TransformDerivativeMatrix dTransform(Extent2D const &input) const noexcept;
286
287private:
288 LinearTransform _linear;
289 Extent2D _translation;
290};
291
293
294//
295// Returns the unique AffineTransform A such that A(p_i)=q_i for i=1,2,3
296//
297AffineTransform makeAffineTransformFromTriple(Point2D const &p1, Point2D const &p2, Point2D const &p3,
298 Point2D const &q1, Point2D const &q2, Point2D const &q3);
299} // namespace geom
300} // namespace lsst
301
302#endif // !LSST_GEOM_AFFINE_TRANSFORM_H
double x
std::ostream * os
Definition: Schema.cc:557
int y
Definition: SpanSet.cc:48
table::Key< int > transform
An affine coordinate transformation consisting of a linear transformation and an offset.
AffineTransform(Eigen::Matrix2d const &linear, Eigen::Vector2d const &translation) noexcept
Construct an AffineTransform from a 2x2 matrix and vector.
TransformDerivativeMatrix dTransform(Point2D const &input) const noexcept
Take the derivative of (*this)(input) w.r.t the transform elements.
static AffineTransform makeRotation(Angle t) noexcept
Construct a new AffineTransform that represents a CCW rotation in radians.
AffineTransform & operator=(AffineTransform &&) noexcept=default
bool isIdentity() const noexcept
Whether the transform is a no-op.
AffineTransform(Eigen::Matrix2d const &linear) noexcept
Construct an AffineTransform with no translation from a 2x2 matrix.
Point2D operator()(Point2D const &p) const noexcept
Transform a Point object.
Extent2D operator()(Extent2D const &p) const noexcept
Transform an Extent object.
void setParameterVector(ParameterVector const &vector) noexcept
Set the transform matrix elements from a parameter vector.
Matrix const getMatrix() const noexcept
Return the transform as a full 3x3 matrix.
double applyY(double x, double y) const noexcept
AffineTransform(LinearTransform const &linear) noexcept
Construct an AffineTransform from a LinearTransform.
ParameterVector const getParameterVector() const noexcept
Return the transform matrix elements as a parameter vector.
AffineTransform const inverted() const
Return the inverse transform.
Extent2D const & getTranslation() const noexcept
AffineTransform(Extent2D const &translation) noexcept
Construct a translation-only AffineTransform from an Extent2D.
Eigen::Matrix< double, 2, 6 > TransformDerivativeMatrix
static AffineTransform makeTranslation(Extent2D translation) noexcept
Construct a new AffineTransform that represents a pure translation.
static AffineTransform makeScaling(double s) noexcept
Construct a new AffineTransform that represents a uniform scaling.
AffineTransform(Eigen::Vector2d const &translation) noexcept
Construct a translation-only AffineTransform from a vector.
AffineTransform operator+(AffineTransform const &other) noexcept
AffineTransform(AffineTransform &&) noexcept=default
AffineTransform() noexcept
Construct an empty (identity) AffineTransform.
AffineTransform operator*(AffineTransform const &other) const noexcept
Construct a new AffineTransform from two others: (B * A)(p) = B(A(p))
AffineTransform & operator-=(AffineTransform const &other) noexcept
double applyX(double x, double y) const noexcept
Transform a point given and returned as separate double values.
AffineTransform(AffineTransform const &) noexcept=default
AffineTransform(LinearTransform const &linear, Extent2D const &translation) noexcept
Construct an AffineTransform from a LinearTransform and Extent2D.
AffineTransform operator-(AffineTransform const &other) noexcept
static AffineTransform makeScaling(double s, double t) noexcept
Construct a new AffineTransform that represents a non-uniform scaling.
AffineTransform(Eigen::Matrix3d const &matrix) noexcept
Construct an AffineTransform from a 3x3 matrix.
LinearTransform & getLinear() noexcept
double operator[](int i) const
AffineTransform & operator=(AffineTransform const &) noexcept=default
Extent2D & getTranslation() noexcept
Eigen::Matrix< double, 6, 1 > ParameterVector
LinearTransform const & getLinear() const noexcept
A class representing an angle.
Definition: Angle.h:128
A 2D linear coordinate transformation.
double applyX(double x, double y) const noexcept
Transform a point given and returned as separate double values.
static LinearTransform makeRotation(Angle t) noexcept
double applyY(double x, double y) const noexcept
static LinearTransform makeScaling(double s) noexcept
AffineTransform makeAffineTransformFromTriple(Point2D const &p1, Point2D const &p2, Point2D const &p3, Point2D const &q1, Point2D const &q2, Point2D const &q3)
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
A base class for image defects.