LSST Applications g034a557a3c+dd8dd8f11d,g0afe43252f+b86e4b8053,g11f7dcd041+017865fdd3,g1cd03abf6b+8446defddb,g1ce3e0751c+f991eae79d,g28da252d5a+ca8a1a9fb3,g2bbee38e9b+b6588ad223,g2bc492864f+b6588ad223,g2cdde0e794+8523d0dbb4,g347aa1857d+b6588ad223,g35bb328faa+b86e4b8053,g3a166c0a6a+b6588ad223,g461a3dce89+b86e4b8053,g52b1c1532d+b86e4b8053,g7f3b0d46df+ad13c1b82d,g80478fca09+f29c5d6c70,g858d7b2824+293f439f82,g8cd86fa7b1+af721d2595,g965a9036f2+293f439f82,g979bb04a14+51ed57f74c,g9ddcbc5298+f24b38b85a,gae0086650b+b86e4b8053,gbb886bcc26+b97e247655,gc28159a63d+b6588ad223,gc30aee3386+a2f0f6cab9,gcaf7e4fdec+293f439f82,gcd45df26be+293f439f82,gcdd4ae20e8+70b5def7e6,gce08ada175+da9c58a417,gcf0d15dbbd+70b5def7e6,gdaeeff99f8+006e14e809,gdbce86181e+6a170ce272,ge3d4d395c2+224150c836,ge5f7162a3a+bb2241c923,ge6cb8fbbf7+d119aed356,ge79ae78c31+b6588ad223,gf048a9a2f4+40ffced2b8,gf0baf85859+b4cca3d10f,w.2024.30
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