LSSTApplications
19.0.0-14-gb0260a2+72efe9b372,20.0.0+7927753e06,20.0.0+8829bf0056,20.0.0+995114c5d2,20.0.0+b6f4b2abd1,20.0.0+bddc4f4cbe,20.0.0-1-g253301a+8829bf0056,20.0.0-1-g2b7511a+0d71a2d77f,20.0.0-1-g5b95a8c+7461dd0434,20.0.0-12-g321c96ea+23efe4bbff,20.0.0-16-gfab17e72e+fdf35455f6,20.0.0-2-g0070d88+ba3ffc8f0b,20.0.0-2-g4dae9ad+ee58a624b3,20.0.0-2-g61b8584+5d3db074ba,20.0.0-2-gb780d76+d529cf1a41,20.0.0-2-ged6426c+226a441f5f,20.0.0-2-gf072044+8829bf0056,20.0.0-2-gf1f7952+ee58a624b3,20.0.0-20-geae50cf+e37fec0aee,20.0.0-25-g3dcad98+544a109665,20.0.0-25-g5eafb0f+ee58a624b3,20.0.0-27-g64178ef+f1f297b00a,20.0.0-3-g4cc78c6+e0676b0dc8,20.0.0-3-g8f21e14+4fd2c12c9a,20.0.0-3-gbd60e8c+187b78b4b8,20.0.0-3-gbecbe05+48431fa087,20.0.0-38-ge4adf513+a12e1f8e37,20.0.0-4-g97dc21a+544a109665,20.0.0-4-gb4befbc+087873070b,20.0.0-4-gf910f65+5d3db074ba,20.0.0-5-gdfe0fee+199202a608,20.0.0-5-gfbfe500+d529cf1a41,20.0.0-6-g64f541c+d529cf1a41,20.0.0-6-g9a5b7a1+a1cd37312e,20.0.0-68-ga3f3dda+5fca18c6a4,20.0.0-9-g4aef684+e18322736b,w.2020.45
LSSTDataManagementBasePackage
|
Go to the documentation of this file.
21 #ifndef LSST_GEOM_ANGLE_H
22 #define LSST_GEOM_ANGLE_H
26 #include <type_traits>
28 #include "boost/math/constants/constants.hpp"
36 #pragma clang diagnostic push
37 #pragma clang diagnostic ignored "-Wunused-variable"
38 double constexpr
PI = boost::math::constants::pi<double>();
40 double constexpr
TWOPI = boost::math::constants::pi<double>() * 2.0;
41 double constexpr
HALFPI = boost::math::constants::pi<double>() * 0.5;
42 double constexpr
ONE_OVER_PI = 1.0 / boost::math::constants::pi<double>();
44 double const SQRTPI = sqrt(boost::math::constants::pi<double>());
45 double const INVSQRTPI = 1.0 / sqrt(boost::math::constants::pi<double>());
46 double constexpr
ROOT2 = boost::math::constants::root_two<double>();
47 #pragma clang diagnostic pop
51 inline constexpr
double degToRad(
double x) noexcept {
return x *
PI / 180.; }
52 inline constexpr
double radToDeg(
double x) noexcept {
return x * 180. /
PI; }
53 inline constexpr
double radToArcsec(
double x) noexcept {
return x * 3600. * 180. /
PI; }
54 inline constexpr
double radToMas(
double x) noexcept {
return x * 1000. * 3600. * 180. /
PI; }
55 inline constexpr
double arcsecToRad(
double x) noexcept {
return (
x / 3600.) *
PI / 180.; }
56 inline constexpr
double masToRad(
double x) noexcept {
return (
x / (1000. * 3600.)) *
PI / 180.; }
105 return (_val == rhs._val);
139 constexpr
Angle() noexcept : _val(0) {}
156 constexpr
operator double() const noexcept {
return _val; }
235 #define ANGLE_OPUP_TYPE(OP, TYPE) \
236 Angle& operator OP(TYPE const& d) noexcept { \
257 #undef ANGLE_OPUP_TYPE
259 #define ANGLE_COMP(OP) \
260 constexpr bool operator OP(const Angle& rhs) const noexcept { return _val OP rhs._val; }
287 #define ANGLE_OP(OP) \
288 inline constexpr Angle operator OP(Angle a, Angle d) noexcept { \
289 return Angle(static_cast<double>(a) OP static_cast<double>(d)); \
294 #define ANGLE_OP_TYPE(OP, TYPE) \
295 inline constexpr Angle operator OP(Angle a, TYPE d) noexcept { \
296 return Angle(static_cast<double>(a) OP d); \
299 inline constexpr Angle operator OP(TYPE d, Angle a) noexcept { \
300 return Angle(d OP static_cast<double>(a)); \
359 template <
typename T>
379 template <
typename T>
394 template <
typename T>
397 "Only numeric types may be multiplied by an AngleUnit to create an Angle!");
398 return Angle(lhs * rhs._val);
406 if (wrapped < 0.0) wrapped +=
TWOPI;
408 if (wrapped >=
TWOPI) wrapped = 0.0;
421 }
else if (wrapped >=
PI) {
434 double const refAngRad = refAng.
asRadians();
435 double wrapped = (*
this - refAng).wrapCtr().asRadians() + refAngRad;
440 if (wrapped - refAngRad >=
PI) {
443 if (wrapped - refAngRad < -
PI) {
470 #endif // if !defined(LSST_GEOM_ANGLE_H)
constexpr AngleUnit degrees
constant with units of degrees
constexpr bool isAngle(T) noexcept
Allow a user to check if they have an angle.
Angle separation(Angle const &other) const noexcept
The signed difference between two Angles.
constexpr double radToDeg(double x) noexcept
constexpr double masToRad(double x) noexcept
constexpr double PI
The ratio of a circle's circumference to diameter.
Angle wrapCtr() const noexcept
Wrap this angle to the range [-π, π).
Angle wrap() const noexcept
Wrap this angle to the range [0, 2π).
constexpr AngleUnit arcseconds
constant with units of arcseconds
constexpr double asArcminutes() const noexcept
Return an Angle's value in arcminutes.
constexpr double ONE_OVER_PI
constexpr Angle(double val, AngleUnit units=radians) noexcept
Construct an Angle with the specified value (interpreted in the given units).
constexpr Angle operator-(Angle a, Angle d) noexcept
Difference of two angles.
constexpr Angle() noexcept
Construct the zero angle.
table::Key< double > angle
size_t operator()(argument_type const &x) const noexcept
constexpr double radToArcsec(double x) noexcept
constexpr friend Angle operator*(T lhs, AngleUnit rhs) noexcept
Use AngleUnit to convert a POD (e.g. int, double) to an Angle; e.g. 180*degrees.
constexpr AngleUnit hours
constant with units of hours
#define ANGLE_OPUP_TYPE(OP, TYPE)
constexpr double asRadians() const noexcept
Return an Angle's value in radians.
constexpr Angle(Angle &&other) noexcept=default
Move constructor.
std::size_t hash_value() const noexcept
Return a hash of this object.
ItemVariant const * other
constexpr AngleUnit milliarcseconds
constant with units of milliarcseconds
constexpr bool operator==(AngleUnit const &rhs) const noexcept
Test if two units are the same.
constexpr Angle operator*(Angle a, Angle d) noexcept
Product of two angles.
Angle & operator=(Angle const &other) noexcept=default
Copy assignment.
constexpr double radToMas(double x) noexcept
std::size_t hash_value() const noexcept
Return a hash of this object.
Angle & operator=(Angle &&other) noexcept=default
Move assignment.
A base class for image defects.
std::ostream & operator<<(std::ostream &os, lsst::geom::AffineTransform const &transform)
constexpr double degToRad(double x) noexcept
constexpr double asAngularUnits(AngleUnit const &units) const noexcept
Return an Angle's value in the specified units.
constexpr AngleUnit arcminutes
constant with units of arcminutes
constexpr Angle(Angle const &other) noexcept=default
Copy constructor.
constexpr Angle operator/(Angle a, int d) noexcept
Ratio of an angle and a scalar.
constexpr double asHours() const noexcept
Return an Angle's value in hours.
A class used to convert scalar POD types such as double to Angle.
A class representing an angle.
constexpr AngleUnit radians
constant with units of radians
constexpr double asDegrees() const noexcept
Return an Angle's value in degrees.
#define ANGLE_OP_TYPE(OP, TYPE)
size_t operator()(argument_type const &x) const noexcept
Angle wrapNear(Angle const &refAng) const noexcept
Wrap this angle to a value x such that -π ≤ x - refAng ≤ π, approximately.
constexpr double asMilliarcseconds() const noexcept
Return an Angle's value in milliarcseconds.
constexpr double asArcseconds() const noexcept
Return an Angle's value in arcseconds.
constexpr AngleUnit(double val)
Define a new angle unit.
constexpr double arcsecToRad(double x) noexcept