LSST Applications 27.0.0,g0265f82a02+469cd937ee,g02d81e74bb+21ad69e7e1,g1470d8bcf6+cbe83ee85a,g2079a07aa2+e67c6346a6,g212a7c68fe+04a9158687,g2305ad1205+94392ce272,g295015adf3+81dd352a9d,g2bbee38e9b+469cd937ee,g337abbeb29+469cd937ee,g3939d97d7f+72a9f7b576,g487adcacf7+71499e7cba,g50ff169b8f+5929b3527e,g52b1c1532d+a6fc98d2e7,g591dd9f2cf+df404f777f,g5a732f18d5+be83d3ecdb,g64a986408d+21ad69e7e1,g858d7b2824+21ad69e7e1,g8a8a8dda67+a6fc98d2e7,g99cad8db69+f62e5b0af5,g9ddcbc5298+d4bad12328,ga1e77700b3+9c366c4306,ga8c6da7877+71e4819109,gb0e22166c9+25ba2f69a1,gb6a65358fc+469cd937ee,gbb8dafda3b+69d3c0e320,gc07e1c2157+a98bf949bb,gc120e1dc64+615ec43309,gc28159a63d+469cd937ee,gcf0d15dbbd+72a9f7b576,gdaeeff99f8+a38ce5ea23,ge6526c86ff+3a7c1ac5f1,ge79ae78c31+469cd937ee,gee10cc3b42+a6fc98d2e7,gf1cff7945b+21ad69e7e1,gfbcc870c63+9a11dc8c8f
LSST Data Management Base Package
Loading...
Searching...
No Matches
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 }
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
int y
Definition SpanSet.cc:48
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