LSSTApplications
21.0.0+1b62c9342b,21.0.0+45a059f35e,21.0.0-1-ga51b5d4+ceb9cf20a3,21.0.0-10-g68cce58c5+c7d3cce47e,21.0.0-2-g103fe59+c1ca725317,21.0.0-2-g1367e85+a1c2f7fe71,21.0.0-2-g2909d54+45a059f35e,21.0.0-2-g45278ab+1b62c9342b,21.0.0-2-g4bc9b9f+b2e40a4e47,21.0.0-2-g5242d73+a1c2f7fe71,21.0.0-2-g54e2caa+c00cf99ed0,21.0.0-2-g66bcc37+27b9d7859a,21.0.0-2-g7f82c8f+203cf74700,21.0.0-2-g8dde007+b0df52bfdd,21.0.0-2-g8f08a60+73884b2cf5,21.0.0-2-ga326454+203cf74700,21.0.0-2-ga63a54e+eec04437aa,21.0.0-2-gc738bc1+59028256f4,21.0.0-2-gde069b7+5a8f2956b8,21.0.0-2-ge17e5af+a1c2f7fe71,21.0.0-2-ge712728+9ad031c87e,21.0.0-2-gecfae73+d3766aec80,21.0.0-2-gfc62afb+a1c2f7fe71,21.0.0-20-g4449a12+38dfb87bce,21.0.0-22-gf0532904+afb8e7912b,21.0.0-3-g4c5b185+a403cb96fd,21.0.0-3-g6d51c4a+27b9d7859a,21.0.0-3-g8076721+e873df194c,21.0.0-3-gaa929c8+df5d87f43a,21.0.0-3-gd222c45+afc8332dbe,21.0.0-4-g1383c07+27b9d7859a,21.0.0-4-g3300ddd+1b62c9342b,21.0.0-4-g5873dc9+9a92674037,21.0.0-4-g8a80011+f67daf2f53,21.0.0-5-gcff38f6+bce43c5818,21.0.0-6-g463d161+44134145d4,21.0.0-6-gd3283ba+df5d87f43a,21.0.0-8-g19111d86+d6551531e4,w.2021.04
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
constexpr double asRadians() const noexcept
Return an Angle's value in radians.
constexpr Angle(Angle &&other) noexcept=default
Move constructor.
#define ANGLE_OP_TYPE(OP, TYPE)
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.
#define ANGLE_OPUP_TYPE(OP, TYPE)
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.
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