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"
39 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) {
table::Key< double > angle
A class representing an angle.
Angle wrapCtr() const noexcept
Wrap this angle to the range [-π, π).
constexpr Angle(Angle const &other) noexcept=default
Copy constructor.
constexpr double asRadians() const noexcept
Return an Angle's value in radians.
constexpr double asHours() const noexcept
Return an Angle's value in hours.
Angle separation(Angle const &other) const noexcept
The signed difference between two Angles.
constexpr Angle(double val, AngleUnit units=radians) noexcept
Construct an Angle with the specified value (interpreted in the given units).
std::size_t hash_value() const noexcept
Return a hash of this object.
constexpr Angle() noexcept
Construct the zero angle.
constexpr Angle operator/(Angle a, double d) noexcept
Ratio of an angle and a scalar.
constexpr double asDegrees() const noexcept
Return an Angle's value in degrees.
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 Angle operator/(Angle a, int d) noexcept
Ratio of an angle and a scalar.
Angle & operator=(Angle &&other) noexcept=default
Move assignment.
Angle wrapNear(Angle const &refAng) const noexcept
Wrap this angle to a value x such that -π ≤ x - refAng ≤ π, approximately.
Angle wrap() const noexcept
Wrap this angle to the range [0, 2π).
constexpr Angle operator-(Angle angle)
An angle in the opposite sense.
Angle & operator=(Angle const &other) noexcept=default
Copy assignment.
constexpr Angle(Angle &&other) noexcept=default
Move constructor.
constexpr double asAngularUnits(AngleUnit const &units) const noexcept
Return an Angle's value in the specified units.
constexpr double asArcminutes() const noexcept
Return an Angle's value in arcminutes.
A class used to convert scalar POD types such as double to Angle.
constexpr AngleUnit(double val)
Define a new angle unit.
constexpr bool operator==(AngleUnit const &rhs) const noexcept
Test if two units are the same.
std::size_t hash_value() const noexcept
Return a hash of this object.
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.
#define ANGLE_OPUP_TYPE(OP, TYPE)
#define ANGLE_OP_TYPE(OP, TYPE)
class[[deprecated("Removed with no replacement (but see lsst::afw::image::TransmissionCurve). Will be " "removed after v22.")]] FilterProperty final
Describe the properties of a Filter (e.g.
constexpr Angle operator*(Angle a, Angle d) noexcept
Product of two angles.
constexpr double arcsecToRad(double x) noexcept
constexpr double radToMas(double x) noexcept
constexpr double PI
The ratio of a circle's circumference to diameter.
constexpr Angle operator/(Angle a, int d) noexcept
Ratio of an angle and a scalar.
constexpr AngleUnit arcseconds
constant with units of arcseconds
constexpr AngleUnit degrees
constant with units of degrees
constexpr double radToDeg(double x) noexcept
constexpr double masToRad(double x) noexcept
constexpr double radToArcsec(double x) noexcept
constexpr AngleUnit hours
constant with units of hours
constexpr AngleUnit milliarcseconds
constant with units of milliarcseconds
constexpr double degToRad(double x) noexcept
std::ostream & operator<<(std::ostream &os, lsst::geom::AffineTransform const &transform)
constexpr double ONE_OVER_PI
constexpr AngleUnit radians
constant with units of radians
constexpr bool isAngle(T) noexcept
Allow a user to check if they have an angle.
constexpr AngleUnit arcminutes
constant with units of arcminutes
A base class for image defects.
size_t operator()(argument_type const &x) const noexcept
size_t operator()(argument_type const &x) const noexcept