LSSTApplications  16.0-1-gce273f5+20,16.0-10-g1758552,16.0-10-gc1446dd+21,16.0-12-g569485f+3,16.0-13-g5f20d24+1,16.0-13-g80874fd+2,16.0-13-gb122224+12,16.0-14-g08f9460+4,16.0-14-g8a3b804,16.0-14-ga5060d2,16.0-15-g77ef378+7,16.0-18-gdf247dd+2,16.0-18-ge18fa5b,16.0-18-ge4151178,16.0-2-g0febb12+16,16.0-2-g9d5294e+46,16.0-2-gc6e0ed0+5,16.0-23-ge8a9b866+3,16.0-3-g404ea43+13,16.0-3-gbc759ec+19,16.0-3-gcfd6c53+44,16.0-3-ge00e371,16.0-4-g03cf288+35,16.0-4-g13a27c5+21,16.0-4-g5f3a788+15,16.0-4-ga3eb747+5,16.0-5-g1991253+21,16.0-5-g1e9226d+3,16.0-5-g6a53317,16.0-5-g865efd9+23,16.0-5-gb3f8a4b+53,16.0-5-gd0f1235+10,16.0-52-gad2f36c79,16.0-7-g6043bfc+9,16.0-7-gd2eeba5+3,16.0-7-gde5bd64+3,16.0-8-g0e813a6+1,16.0-9-g52c50f7,16.0-9-g73415e6,master-g5768c874b9+5,w.2018.41
LSSTDataManagementBasePackage
Orientation.cc
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2008, 2009, 2010, 2011, 2012, 2013, 2014 LSST Corporation.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
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 LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <http://www.lsstcorp.org/LegalNotices/>.
21  */
22 
25 
26 namespace lsst {
27 namespace afw {
28 namespace cameraGeom {
29 
31  lsst::geom::Angle const yaw, lsst::geom::Angle const pitch,
32  lsst::geom::Angle const roll)
33  : _fpPosition(fpPosition), _refPoint(refPoint), _yaw(yaw), _pitch(pitch), _roll(roll), _rotMat() {
34  double cosYaw = std::cos(_yaw);
35  double sinYaw = std::sin(_yaw);
36  double cosPitch = std::cos(_pitch);
37  double sinPitch = std::sin(_pitch);
38  double cosRoll = std::cos(_roll);
39  double sinRoll = std::sin(_roll);
40 
41  // This comes from the rotation matrix written down here:
42  // http://en.wikipedia.org/wiki/Euler_angles
43  // for Tait-Bryan angles Z_1Y_2X_3
44  // _rotMat = coeffA coeffB
45  // coeffD coeffE
46  _rotMat << cosYaw * cosPitch, cosYaw * sinPitch * sinRoll - cosRoll * sinYaw, cosPitch * sinYaw,
47  cosYaw * cosRoll + sinYaw * sinPitch * sinRoll;
48 }
49 
50 Orientation::~Orientation() noexcept = default;
51 // Can't combine noexcept and =default until Eigen::Matrix supports noexcept
53  : _fpPosition(other._fpPosition),
54  _refPoint(other._refPoint),
55  _yaw(other._yaw),
56  _pitch(other._pitch),
57  _roll(other._roll),
58  _rotMat(other._rotMat) {}
60  : _fpPosition(std::move(other._fpPosition)),
61  _refPoint(std::move(other._refPoint)),
62  _yaw(std::move(other._yaw)),
63  _pitch(std::move(other._pitch)),
64  _roll(std::move(other._roll)),
65  _rotMat(std::move(other._rotMat)) {}
67  _fpPosition = other._fpPosition;
68  _refPoint = other._refPoint;
69  _yaw = other._yaw;
70  _pitch = other._pitch;
71  _roll = other._roll;
72  _rotMat = other._rotMat;
73  return *this;
74 }
76  _fpPosition = std::move(other._fpPosition);
77  _refPoint = std::move(other._refPoint);
78  _yaw = std::move(other._yaw);
79  _pitch = std::move(other._pitch);
80  _roll = std::move(other._roll);
81  _rotMat = std::move(other._rotMat);
82  return *this;
83 }
84 
85 int Orientation::getNQuarter() const noexcept {
86  float yawDeg = _yaw.asDegrees();
87  while (yawDeg < 0.) {
88  yawDeg += 360.;
89  }
90  return std::floor((yawDeg + 45.) / 90.);
91 }
92 
94  lsst::geom::Extent2D const pixelSizeMm) const {
95  // jacobian = coeffA*pixelSizeMmX, coeffB*pixelSizeMmY,
96  // coeffD*pixelSizeMmX, coeffE*pixelSizeMmY
97  Eigen::Matrix2d jacobian =
98  _rotMat.array() * (Eigen::Vector2d::Ones() * pixelSizeMm.asEigen().transpose()).array();
99 
100  Eigen::Vector2d refMm = pixelSizeMm.asEigen().array() * _refPoint.asEigen().array();
101  Eigen::Vector2d translation = _fpPosition.asEigen() - (_rotMat * refMm);
102 
103  lsst::geom::AffineTransform affineTransform = lsst::geom::AffineTransform(jacobian, translation);
104  return afw::geom::makeTransform(affineTransform);
105 }
106 
108  lsst::geom::Extent2D const pixelSizeMm) const {
109  return makePixelFpTransform(pixelSizeMm)->inverted();
110 }
111 
112 } // namespace cameraGeom
113 } // namespace afw
114 } // namespace lsst
constexpr double asDegrees() const noexcept
Return an Angle&#39;s value in degrees.
Definition: Angle.h:166
An affine coordinate transformation consisting of a linear transformation and an offset.
std::shared_ptr< geom::TransformPoint2ToPoint2 > makePixelFpTransform(lsst::geom::Extent2D const pixelSizeMm) const
Generate a Transform from pixel to focal plane coordinates.
Definition: Orientation.cc:93
std::shared_ptr< geom::TransformPoint2ToPoint2 > makeFpPixelTransform(lsst::geom::Extent2D const pixelSizeMm) const
Generate a Transform from focal plane to pixel coordinates.
Definition: Orientation.cc:107
T floor(T... args)
A class representing an angle.
Definition: Angle.h:124
Describe a detector&#39;s orientation in the focal plane.
Definition: Orientation.h:52
T sin(T... args)
A base class for image defects.
Definition: cameraGeom.dox:3
int getNQuarter() const noexcept
Return the number of quarter turns (rounded to the closest quarter)
Definition: Orientation.cc:85
Orientation(lsst::geom::Point2D const fpPosition=lsst::geom::Point2D(0, 0), lsst::geom::Point2D const refPoint=lsst::geom::Point2D(-0.5, -0.5), lsst::geom::Angle const yaw=lsst::geom::Angle(0), lsst::geom::Angle const pitch=lsst::geom::Angle(0), lsst::geom::Angle const roll=lsst::geom::Angle(0))
Definition: Orientation.cc:30
Orientation & operator=(Orientation const &) noexcept
Definition: Orientation.cc:66
T cos(T... args)
T move(T... args)
EigenVector const & asEigen() const noexcept(IS_ELEMENT_NOTHROW_COPYABLE)
Return a fixed-size Eigen representation of the coordinate object.
ItemVariant const * other
Definition: Schema.cc:55
std::shared_ptr< TransformPoint2ToPoint2 > makeTransform(lsst::geom::AffineTransform const &affine)
Wrap an lsst::geom::AffineTransform as a Transform.