LSST Applications g0f08755f38+82efc23009,g12f32b3c4e+e7bdf1200e,g1653933729+a8ce1bb630,g1a0ca8cf93+50eff2b06f,g28da252d5a+52db39f6a5,g2bbee38e9b+37c5a29d61,g2bc492864f+37c5a29d61,g2cdde0e794+c05ff076ad,g3156d2b45e+41e33cbcdc,g347aa1857d+37c5a29d61,g35bb328faa+a8ce1bb630,g3a166c0a6a+37c5a29d61,g3e281a1b8c+fb992f5633,g414038480c+7f03dfc1b0,g41af890bb2+11b950c980,g5fbc88fb19+17cd334064,g6b1c1869cb+12dd639c9a,g781aacb6e4+a8ce1bb630,g80478fca09+72e9651da0,g82479be7b0+04c31367b4,g858d7b2824+82efc23009,g9125e01d80+a8ce1bb630,g9726552aa6+8047e3811d,ga5288a1d22+e532dc0a0b,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+37c5a29d61,gcf0d15dbbd+2acd6d4d48,gd7358e8bfb+778a810b6e,gda3e153d99+82efc23009,gda6a2b7d83+2acd6d4d48,gdaeeff99f8+1711a396fd,ge2409df99d+6b12de1076,ge79ae78c31+37c5a29d61,gf0baf85859+d0a5978c5a,gf3967379c6+4954f8c433,gfb92a5be7c+82efc23009,gfec2e1e490+2aaed99252,w.2024.46
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
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