LSST Applications g070148d5b3+33e5256705,g0d53e28543+25c8b88941,g0da5cf3356+2dd1178308,g1081da9e2a+62d12e78cb,g17e5ecfddb+7e422d6136,g1c76d35bf8+ede3a706f7,g295839609d+225697d880,g2e2c1a68ba+cc1f6f037e,g2ffcdf413f+853cd4dcde,g38293774b4+62d12e78cb,g3b44f30a73+d953f1ac34,g48ccf36440+885b902d19,g4b2f1765b6+7dedbde6d2,g5320a0a9f6+0c5d6105b6,g56b687f8c9+ede3a706f7,g5c4744a4d9+ef6ac23297,g5ffd174ac0+0c5d6105b6,g6075d09f38+66af417445,g667d525e37+2ced63db88,g670421136f+2ced63db88,g71f27ac40c+2ced63db88,g774830318a+463cbe8d1f,g7876bc68e5+1d137996f1,g7985c39107+62d12e78cb,g7fdac2220c+0fd8241c05,g96f01af41f+368e6903a7,g9ca82378b8+2ced63db88,g9d27549199+ef6ac23297,gabe93b2c52+e3573e3735,gb065e2a02a+3dfbe639da,gbc3249ced9+0c5d6105b6,gbec6a3398f+0c5d6105b6,gc9534b9d65+35b9f25267,gd01420fc67+0c5d6105b6,geee7ff78d7+a14128c129,gf63283c776+ede3a706f7,gfed783d017+0c5d6105b6,w.2022.47
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Friends | Related Functions | List of all members
lsst::geom::Angle Class Referencefinal

A class representing an angle. More...

#include <Angle.h>

Public Member Functions

constexpr Angle (double val, AngleUnit units=radians) noexcept
 Construct an Angle with the specified value (interpreted in the given units). More...
 
constexpr Angle () noexcept
 Construct the zero angle. More...
 
 Angle (sphgeom::Angle const &sgAngle) noexcept
 Convert from a sphgeom::Angle instance. More...
 
constexpr Angle (Angle const &other) noexcept=default
 Copy constructor. More...
 
constexpr Angle (Angle &&other) noexcept=default
 Move constructor. More...
 
Angleoperator= (Angle const &other) noexcept=default
 Copy assignment. More...
 
Angleoperator= (Angle &&other) noexcept=default
 Move assignment. More...
 
 ~Angle ()=default
 
constexpr operator double () const noexcept
 Convert an Angle to a double in radians. More...
 
 operator sphgeom::Angle () const noexcept
 Convert to a sphgeom::Angle instance. More...
 
constexpr double asAngularUnits (AngleUnit const &units) const noexcept
 Return an Angle's value in the specified units. More...
 
constexpr double asRadians () const noexcept
 Return an Angle's value in radians. More...
 
constexpr double asDegrees () const noexcept
 Return an Angle's value in degrees. More...
 
constexpr double asHours () const noexcept
 Return an Angle's value in hours. More...
 
constexpr double asArcminutes () const noexcept
 Return an Angle's value in arcminutes. More...
 
constexpr double asArcseconds () const noexcept
 Return an Angle's value in arcseconds. More...
 
constexpr double asMilliarcseconds () const noexcept
 Return an Angle's value in milliarcseconds. More...
 
Angle wrap () const noexcept
 Wrap this angle to the range [0, 2π). More...
 
Angle wrapCtr () const noexcept
 Wrap this angle to the range [-π, π). More...
 
Angle wrapNear (Angle const &refAng) const noexcept
 Wrap this angle to a value x such that -π ≤ x - refAng ≤ π, approximately. More...
 
Angle separation (Angle const &other) const noexcept
 The signed difference between two Angles. More...
 
Angleoperator*= (double const &d) noexcept
 Multiply this angle by the given factor. More...
 
Angleoperator*= (int const &d) noexcept
 
Angleoperator+= (double const &d) noexcept
 Increase this angle by the given number of radians. More...
 
Angleoperator+= (int const &d) noexcept
 
Angleoperator-= (double const &d) noexcept
 Decrease this angle by the given number of radians. More...
 
Angleoperator-= (int const &d) noexcept
 
constexpr bool operator== (const Angle &rhs) const noexcept
 Test if two Angles represent the same angle (without wrapping). More...
 
constexpr bool operator!= (const Angle &rhs) const noexcept
 
constexpr bool operator<= (const Angle &rhs) const noexcept
 Compare the sizes of two Angles (without wrapping). More...
 
constexpr bool operator>= (const Angle &rhs) const noexcept
 
constexpr bool operator< (const Angle &rhs) const noexcept
 
constexpr bool operator> (const Angle &rhs) const noexcept
 
std::size_t hash_value () const noexcept
 Return a hash of this object. More...
 

Friends

class AngleUnit
 

Related Functions

(Note that these are not member functions.)

constexpr Angle operator+ (Angle a, Angle d) noexcept
 Sum of two angles. More...
 
constexpr Angle operator- (Angle a, Angle d) noexcept
 Difference of two angles. More...
 
constexpr Angle operator* (Angle a, Angle d) noexcept
 Product of two angles. More...
 
constexpr Angle operator* (Angle a, double d) noexcept
 Product of an angle and a scalar. More...
 
constexpr Angle operator- (Angle angle)
 An angle in the opposite sense. More...
 
constexpr Angle operator/ (Angle a, int d) noexcept
 Ratio of an angle and a scalar. More...
 
constexpr Angle operator/ (Angle a, double d) noexcept
 Ratio of an angle and a scalar. More...
 
std::ostreamoperator<< (std::ostream &s, Angle a)
 Print an Angle to a stream. More...
 
template<typename T >
constexpr Angle operator* (T lhs, AngleUnit rhs) noexcept
 Use AngleUnit to convert a POD (e.g. int, double) to an Angle; e.g. 180*degrees. More...
 

Detailed Description

A class representing an angle.

Angles may be manipulated like doubles, and automatically converted to doubles, but they may not be constructed from doubles without calling a constructor or multiplying by an AngleUnit. Angles can be modified only by assignment; all other operations that transform an Angle return a new Angle instead.

Unless otherwise specified, all methods and associated operators shall not throw exceptions.

Definition at line 128 of file Angle.h.

Constructor & Destructor Documentation

◆ Angle() [1/5]

constexpr lsst::geom::Angle::Angle ( double  val,
AngleUnit  units = radians 
)
inlineexplicitconstexprnoexcept

Construct an Angle with the specified value (interpreted in the given units).

Parameters
valthe size of the angle
unitsthe units in which val is measured

Definition at line 137 of file Angle.h.

137: _val(val * units._val) {}
ImageT val
Definition: CR.cc:146

◆ Angle() [2/5]

constexpr lsst::geom::Angle::Angle ( )
inlineconstexprnoexcept

Construct the zero angle.

Definition at line 140 of file Angle.h.

140: _val(0) {}

◆ Angle() [3/5]

lsst::geom::Angle::Angle ( sphgeom::Angle const &  sgAngle)
inlineexplicitnoexcept

Convert from a sphgeom::Angle instance.

Definition at line 143 of file Angle.h.

143: Angle(sgAngle.asRadians()) {}
constexpr Angle() noexcept
Construct the zero angle.
Definition: Angle.h:140

◆ Angle() [4/5]

constexpr lsst::geom::Angle::Angle ( Angle const &  other)
constexprdefaultnoexcept

Copy constructor.

◆ Angle() [5/5]

constexpr lsst::geom::Angle::Angle ( Angle &&  other)
constexprdefaultnoexcept

Move constructor.

◆ ~Angle()

lsst::geom::Angle::~Angle ( )
default

Member Function Documentation

◆ asAngularUnits()

constexpr double lsst::geom::Angle::asAngularUnits ( AngleUnit const &  units) const
inlineconstexprnoexcept

Return an Angle's value in the specified units.

Parameters
unitsthe units in which the angle's value is desired (e.g. degrees).

Definition at line 170 of file Angle.h.

170{ return _val / units._val; }

◆ asArcminutes()

constexpr double lsst::geom::Angle::asArcminutes ( ) const
inlineconstexprnoexcept

Return an Angle's value in arcminutes.

Definition at line 182 of file Angle.h.

182{ return asAngularUnits(arcminutes); }
constexpr double asAngularUnits(AngleUnit const &units) const noexcept
Return an Angle's value in the specified units.
Definition: Angle.h:170
AngleUnit constexpr arcminutes
constant with units of arcminutes
Definition: Angle.h:112

◆ asArcseconds()

constexpr double lsst::geom::Angle::asArcseconds ( ) const
inlineconstexprnoexcept

Return an Angle's value in arcseconds.

Definition at line 185 of file Angle.h.

185{ return asAngularUnits(arcseconds); }
AngleUnit constexpr arcseconds
constant with units of arcseconds
Definition: Angle.h:113

◆ asDegrees()

constexpr double lsst::geom::Angle::asDegrees ( ) const
inlineconstexprnoexcept

Return an Angle's value in degrees.

Definition at line 176 of file Angle.h.

176{ return asAngularUnits(degrees); }
AngleUnit constexpr degrees
constant with units of degrees
Definition: Angle.h:110

◆ asHours()

constexpr double lsst::geom::Angle::asHours ( ) const
inlineconstexprnoexcept

Return an Angle's value in hours.

Definition at line 179 of file Angle.h.

179{ return asAngularUnits(hours); }
AngleUnit constexpr hours
constant with units of hours
Definition: Angle.h:111

◆ asMilliarcseconds()

constexpr double lsst::geom::Angle::asMilliarcseconds ( ) const
inlineconstexprnoexcept

Return an Angle's value in milliarcseconds.

Definition at line 188 of file Angle.h.

AngleUnit constexpr milliarcseconds
constant with units of milliarcseconds
Definition: Angle.h:116

◆ asRadians()

constexpr double lsst::geom::Angle::asRadians ( ) const
inlineconstexprnoexcept

Return an Angle's value in radians.

Definition at line 173 of file Angle.h.

173{ return asAngularUnits(radians); }
AngleUnit constexpr radians
constant with units of radians
Definition: Angle.h:109

◆ hash_value()

std::size_t lsst::geom::Angle::hash_value ( ) const
inlinenoexcept

Return a hash of this object.

Definition at line 285 of file Angle.h.

285{ return std::hash<double>()(_val); }

◆ operator double()

constexpr lsst::geom::Angle::operator double ( ) const
inlineconstexprnoexcept

Convert an Angle to a double in radians.

Definition at line 160 of file Angle.h.

160{ return _val; }

◆ operator sphgeom::Angle()

lsst::geom::Angle::operator sphgeom::Angle ( ) const
inlinenoexcept

Convert to a sphgeom::Angle instance.

Definition at line 163 of file Angle.h.

163{ return sphgeom::Angle::fromRadians(_val); }
static Angle fromRadians(double a)
Definition: Angle.h:51

◆ operator!=()

constexpr bool lsst::geom::Angle::operator!= ( const Angle rhs) const
inlineconstexprnoexcept

Definition at line 272 of file Angle.h.

◆ operator*=() [1/2]

Angle & lsst::geom::Angle::operator*= ( double const &  d)
inlinenoexcept

Multiply this angle by the given factor.

Definition at line 250 of file Angle.h.

267{ return _val OP rhs._val; }

◆ operator*=() [2/2]

Angle & lsst::geom::Angle::operator*= ( int const &  d)
inlinenoexcept

Definition at line 251 of file Angle.h.

267{ return _val OP rhs._val; }

◆ operator+=() [1/2]

Angle & lsst::geom::Angle::operator+= ( double const &  d)
inlinenoexcept

Increase this angle by the given number of radians.

Definition at line 255 of file Angle.h.

267{ return _val OP rhs._val; }

◆ operator+=() [2/2]

Angle & lsst::geom::Angle::operator+= ( int const &  d)
inlinenoexcept

Definition at line 256 of file Angle.h.

267{ return _val OP rhs._val; }

◆ operator-=() [1/2]

Angle & lsst::geom::Angle::operator-= ( double const &  d)
inlinenoexcept

Decrease this angle by the given number of radians.

Definition at line 260 of file Angle.h.

267{ return _val OP rhs._val; }

◆ operator-=() [2/2]

Angle & lsst::geom::Angle::operator-= ( int const &  d)
inlinenoexcept

Definition at line 261 of file Angle.h.

267{ return _val OP rhs._val; }

◆ operator<()

constexpr bool lsst::geom::Angle::operator< ( const Angle rhs) const
inlineconstexprnoexcept

Definition at line 278 of file Angle.h.

◆ operator<=()

constexpr bool lsst::geom::Angle::operator<= ( const Angle rhs) const
inlineconstexprnoexcept

Compare the sizes of two Angles (without wrapping).

Definition at line 276 of file Angle.h.

◆ operator=() [1/2]

Angle & lsst::geom::Angle::operator= ( Angle &&  other)
defaultnoexcept

Move assignment.

◆ operator=() [2/2]

Angle & lsst::geom::Angle::operator= ( Angle const &  other)
defaultnoexcept

Copy assignment.

◆ operator==()

constexpr bool lsst::geom::Angle::operator== ( const Angle rhs) const
inlineconstexprnoexcept

Test if two Angles represent the same angle (without wrapping).

Definition at line 271 of file Angle.h.

◆ operator>()

constexpr bool lsst::geom::Angle::operator> ( const Angle rhs) const
inlineconstexprnoexcept

Definition at line 279 of file Angle.h.

◆ operator>=()

constexpr bool lsst::geom::Angle::operator>= ( const Angle rhs) const
inlineconstexprnoexcept

Definition at line 277 of file Angle.h.

◆ separation()

Angle lsst::geom::Angle::separation ( Angle const &  other) const
inlinenoexcept

The signed difference between two Angles.

Parameters
otherthe angle to which this angle will be compared
Returns
*this - other, wrapped to the range [-π, π)
Exception Safety
Shall not throw exceptions.

Definition at line 456 of file Angle.h.

456{ return (*this - other).wrapCtr(); }

◆ wrap()

Angle lsst::geom::Angle::wrap ( ) const
inlinenoexcept

Wrap this angle to the range [0, 2π).

Returns
an angle in the normalized interval.
Exception Safety
Shall not throw exceptions.
Warning
The upper limit is only guaranteed for radians; the upper limit may be slightly squishy for other units, due to roundoff errors. Whether there are any violations is unknown; please update this comment if you can prove that the limits are or are not valid for all supported units.

Definition at line 410 of file Angle.h.

410 {
411 double wrapped = std::fmod(_val, TWOPI);
412 // wrapped is in the range (-TWOPI, TWOPI)
413 if (wrapped < 0.0) wrapped += TWOPI;
414 // if wrapped is small enough, adding 2 pi gives 2 pi
415 if (wrapped >= TWOPI) wrapped = 0.0;
416 return wrapped * radians;
417}
T fmod(T... args)
double constexpr TWOPI
Definition: Angle.h:41

◆ wrapCtr()

Angle lsst::geom::Angle::wrapCtr ( ) const
inlinenoexcept

Wrap this angle to the range [-π, π).

Returns
an angle in the normalized interval.
Exception Safety
Shall not throw exceptions.
Warning
Exact limits are only guaranteed for radians; limits for other units may be slightly squishy, due to roundoff errors. Whether there are any violations is unknown; please update this comment if you can prove that the limits are or are not valid for all supported units.

Definition at line 419 of file Angle.h.

419 {
420 double wrapped = std::fmod(_val, TWOPI);
421 // wrapped is in the range [-TWOPI, TWOPI]
422 if (wrapped < -PI) {
423 wrapped += TWOPI;
424 if (wrapped >= PI) {
425 // handle roundoff error, however unlikely
426 wrapped = -PI;
427 }
428 } else if (wrapped >= PI) {
429 wrapped -= TWOPI;
430 if (wrapped < -PI) {
431 // handle roundoff error, however unlikely
432 wrapped = -PI;
433 }
434 }
435 return wrapped * radians;
436}
double constexpr PI
The ratio of a circle's circumference to diameter.
Definition: Angle.h:40

◆ wrapNear()

Angle lsst::geom::Angle::wrapNear ( Angle const &  refAng) const
inlinenoexcept

Wrap this angle to a value x such that -π ≤ x - refAng ≤ π, approximately.

Parameters
refAngreference angle to match
Returns
an angle in the custom normalized interval.
Exception Safety
Shall not throw exceptions.
Warning
The only firm limit is -π ≤ x - refAng in radians. The upper limit in radians and both limits in other units are somewhat squishy, due to roundoff error.

Definition at line 438 of file Angle.h.

438 {
439 // compute (this - refAng).wrapCtr() + refAng
440 // which is correct except for roundoff error at the edges
441 double const refAngRad = refAng.asRadians();
442 double wrapped = (*this - refAng).wrapCtr().asRadians() + refAngRad;
443
444 // roundoff can cause slightly out-of-range values; fix those as bast we can;
445 // note that both conditionals are wanted, since either or both may execute
446 // (though if/else could be used if the lower limit was squishy for radians)
447 if (wrapped - refAngRad >= PI) {
448 wrapped -= TWOPI;
449 }
450 if (wrapped - refAngRad < -PI) {
451 wrapped += TWOPI;
452 }
453 return wrapped * radians;
454}
Angle wrapCtr() const noexcept
Wrap this angle to the range [-π, π).
Definition: Angle.h:419
constexpr double asRadians() const noexcept
Return an Angle's value in radians.
Definition: Angle.h:173

Friends And Related Function Documentation

◆ AngleUnit

friend class AngleUnit
friend

Definition at line 129 of file Angle.h.

◆ operator*() [1/3]

constexpr Angle operator* ( Angle  a,
Angle  d 
)
related

Product of two angles.

Warning
The result will be treated like an planar angle, not a solid angle.

Definition at line 329 of file Angle.h.

348{ return Angle(-static_cast<double>(angle)); }
table::Key< double > angle

◆ operator*() [2/3]

constexpr Angle operator* ( Angle  a,
double  d 
)
related

Product of an angle and a scalar.

Definition at line 336 of file Angle.h.

348{ return Angle(-static_cast<double>(angle)); }

◆ operator*() [3/3]

template<typename T >
constexpr Angle operator* ( lhs,
AngleUnit  rhs 
)
related

Use AngleUnit to convert a POD (e.g. int, double) to an Angle; e.g. 180*degrees.

Parameters
lhsthe value to convert
rhsthe conversion coefficient
Exception Safety
Shall not throw exceptions.

Definition at line 402 of file Angle.h.

402 {
403 static_assert(std::is_arithmetic<T>::value,
404 "Only numeric types may be multiplied by an AngleUnit to create an Angle!");
405 return Angle(lhs * rhs._val);
406}

◆ operator+()

constexpr Angle operator+ ( Angle  a,
Angle  d 
)
related

Sum of two angles.

Definition at line 315 of file Angle.h.

348{ return Angle(-static_cast<double>(angle)); }

◆ operator-() [1/2]

constexpr Angle operator- ( Angle  a,
Angle  d 
)
related

Difference of two angles.

Definition at line 321 of file Angle.h.

348{ return Angle(-static_cast<double>(angle)); }

◆ operator-() [2/2]

constexpr Angle operator- ( Angle  angle)
related

An angle in the opposite sense.

Definition at line 348 of file Angle.h.

348{ return Angle(-static_cast<double>(angle)); }

◆ operator/() [1/2]

constexpr Angle operator/ ( Angle  a,
double  d 
)
related

Ratio of an angle and a scalar.

Definition at line 363 of file Angle.h.

363{ return Angle(static_cast<double>(a) / d); }
table::Key< int > a

◆ operator/() [2/2]

constexpr Angle operator/ ( Angle  a,
int  d 
)
related

Ratio of an angle and a scalar.

Definition at line 356 of file Angle.h.

356{ return Angle(static_cast<double>(a) / d); }

◆ operator<<()

std::ostream & operator<< ( std::ostream s,
Angle  a 
)
related

Print an Angle to a stream.

The exact details of the string representation are unspecified and subject to change, but the following may be regarded as typical: "0.567 rad".

Parameters
sThe output stream.
aThe angle.
Exception Safety
Provides basic exception guarantee.

Definition at line 29 of file Angle.cc.

29{ return s << static_cast<double>(a) << " rad"; }

The documentation for this class was generated from the following file: