LSSTApplications  15.0+21,16.0+1,16.0+10,16.0+3,16.0+4,16.0-1-g2115a9e+4,16.0-1-g4515a79+8,16.0-1-g7bb14cc,16.0-1-g80120d7+6,16.0-1-g98efed3+6,16.0-1-gb7f560d+3,16.0-18-g7a076d417,16.0-2-g2ed7261+3,16.0-2-g311bfd2,16.0-2-g568a347+5,16.0-2-g7adb079,16.0-2-gd4c87cb+5,16.0-3-g099ede0,16.0-3-g150e024+5,16.0-3-g1f513a6+2,16.0-3-g958ce35,16.0-3-gc6a11d1,16.0-4-g84f75fb+7,16.0-4-gcfd1396+6,16.0-4-gde8cee2,16.0-5-g7bc0afb+5,16.0-5-g81851deb,16.0-5-g82b7855+1,16.0-5-gd32631f,16.0-5-gf14cb0b,16.0-6-g2dd73041+6,16.0-6-gcf12234+1,16.0-7-g95fb7bf+2,16.0-7-gc37dbc2+6,w.2018.28
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 
104  return afw::geom::makeTransform(affineTransform);
105 }
106 
108  lsst::geom::Extent2D const pixelSizeMm) const {
109  return makePixelFpTransform(pixelSizeMm)->getInverse();
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.