LSST Applications g063fba187b+fee0456c91,g0f08755f38+ea96e5a5a3,g1653933729+a8ce1bb630,g168dd56ebc+a8ce1bb630,g1a2382251a+90257ff92a,g20f6ffc8e0+ea96e5a5a3,g217e2c1bcf+937a289c59,g28da252d5a+daa7da44eb,g2bbee38e9b+253935c60e,g2bc492864f+253935c60e,g3156d2b45e+6e55a43351,g32e5bea42b+31359a2a7a,g347aa1857d+253935c60e,g35bb328faa+a8ce1bb630,g3a166c0a6a+253935c60e,g3b1af351f3+a8ce1bb630,g3e281a1b8c+c5dd892a6c,g414038480c+416496e02f,g41af890bb2+afe91b1188,g599934f4f4+0db33f7991,g7af13505b9+e36de7bce6,g80478fca09+da231ba887,g82479be7b0+a4516e59e3,g858d7b2824+ea96e5a5a3,g89c8672015+f4add4ffd5,g9125e01d80+a8ce1bb630,ga5288a1d22+bc6ab8dfbd,gb58c049af0+d64f4d3760,gc28159a63d+253935c60e,gcab2d0539d+3f2b72788c,gcf0d15dbbd+4ea9c45075,gda6a2b7d83+4ea9c45075,gdaeeff99f8+1711a396fd,ge79ae78c31+253935c60e,gef2f8181fd+3031e3cf99,gf0baf85859+c1f95f4921,gfa517265be+ea96e5a5a3,gfa999e8aa5+17cd334064,w.2024.50
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