LSST Applications g02d81e74bb+86cf3d8bc9,g180d380827+7a4e862ed4,g2079a07aa2+86d27d4dc4,g2305ad1205+e1ca1c66fa,g29320951ab+012e1474a1,g295015adf3+341ea1ce94,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g33d1c0ed96+0e5473021a,g3a166c0a6a+0e5473021a,g3ddfee87b4+c429d67c83,g48712c4677+f88676dd22,g487adcacf7+27e1e21933,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+b41db86c35,g5a732f18d5+53520f316c,g64a986408d+86cf3d8bc9,g858d7b2824+86cf3d8bc9,g8a8a8dda67+585e252eca,g99cad8db69+84912a7fdc,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,ga8c6da7877+a2b54eae19,gb0e22166c9+60f28cb32d,gba4ed39666+c2a2e4ac27,gbb8dafda3b+6681f309db,gc120e1dc64+f0fcc2f6d8,gc28159a63d+0e5473021a,gcf0d15dbbd+c429d67c83,gdaeeff99f8+f9a426f77a,ge6526c86ff+0433e6603d,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gff1a9f87cc+86cf3d8bc9,w.2024.17
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | List of all members
lsst::sphgeom::NormalizedAngle Class Reference

NormalizedAngle is an angle that lies in the range [0, 2π), with one exception - a NormalizedAngle can be NaN. More...

#include <NormalizedAngle.h>

Public Member Functions

 NormalizedAngle ()=default
 This constructor creates a NormalizedAngle with a value of zero.
 
 NormalizedAngle (NormalizedAngle const &a)=default
 This constructor creates a copy of a.
 
 NormalizedAngle (Angle const &a)
 This constructor creates a normalized copy of a.
 
 NormalizedAngle (double a)
 This constructor creates a NormalizedAngle with the given value in radians, normalized to be in the range [0, 2π).
 
 NormalizedAngle (LonLat const &, LonLat const &)
 This constructor creates a NormalizedAngle equal to the angle between the given points on the unit sphere.
 
 NormalizedAngle (Vector3d const &, Vector3d const &)
 This constructor creates a NormalizedAngle equal to the angle between the given 3-vectors, which need not have unit norm.
 
 operator Angle const & () const
 This conversion operator returns a const reference to the underlying Angle.
 
bool operator== (Angle const &a) const
 
bool operator!= (Angle const &a) const
 
bool operator< (Angle const &a) const
 
bool operator> (Angle const &a) const
 
bool operator<= (Angle const &a) const
 
bool operator>= (Angle const &a) const
 
Angle operator- () const
 
Angle operator+ (Angle const &a) const
 
Angle operator- (Angle const &a) const
 
Angle operator* (double a) const
 
Angle operator/ (double a) const
 
double operator/ (Angle const &a) const
 
double asDegrees () const
 asDegrees returns the value of this angle in units of degrees.
 
double asRadians () const
 asRadians returns the value of this angle in units of radians.
 
bool isNan () const
 isNan returns true if the angle value is NaN.
 
NormalizedAngle getAngleTo (NormalizedAngle const &a) const
 getAngleTo computes the angle α ∈ [0, 2π) such that adding α to this angle and then normalizing the result yields a.
 

Static Public Member Functions

static NormalizedAngle nan ()
 
static NormalizedAngle fromDegrees (double a)
 
static NormalizedAngle fromRadians (double a)
 
static NormalizedAngle between (NormalizedAngle const &a, NormalizedAngle const &b)
 For two angles a and b, between(a, b) returns the smaller of a.getAngleTo(b) and b.getAngleTo(a).
 
static NormalizedAngle center (NormalizedAngle const &a, NormalizedAngle const &b)
 For two normalized angles a and b, center(a, b) returns the angle m such that a.getAngleTo(m) is equal to m.getAngleTo(b).
 

Detailed Description

NormalizedAngle is an angle that lies in the range [0, 2π), with one exception - a NormalizedAngle can be NaN.

Definition at line 50 of file NormalizedAngle.h.

Constructor & Destructor Documentation

◆ NormalizedAngle() [1/6]

lsst::sphgeom::NormalizedAngle::NormalizedAngle ( )
default

This constructor creates a NormalizedAngle with a value of zero.

◆ NormalizedAngle() [2/6]

lsst::sphgeom::NormalizedAngle::NormalizedAngle ( NormalizedAngle const & a)
default

This constructor creates a copy of a.

◆ NormalizedAngle() [3/6]

lsst::sphgeom::NormalizedAngle::NormalizedAngle ( Angle const & a)
inlineexplicit

This constructor creates a normalized copy of a.

Definition at line 86 of file NormalizedAngle.h.

86 {
87 *this = NormalizedAngle(a.asRadians());
88 }
NormalizedAngle()=default
This constructor creates a NormalizedAngle with a value of zero.

◆ NormalizedAngle() [4/6]

lsst::sphgeom::NormalizedAngle::NormalizedAngle ( double a)
inlineexplicit

This constructor creates a NormalizedAngle with the given value in radians, normalized to be in the range [0, 2π).

Definition at line 92 of file NormalizedAngle.h.

92 {
93 // For really large |a|, the error in this reduction can exceed 2*PI
94 // (because PI is only an approximation to π).
95 if (a < 0.0) {
96 _a = Angle(std::fmod(a, 2.0 * PI) + 2.0 * PI);
97 } else if (a > 2 * PI) {
98 _a = Angle(std::fmod(a, 2.0 * PI));
99 } else {
100 _a = Angle(a);
101 }
102 }
T fmod(T... args)
constexpr double PI
Definition constants.h:43

◆ NormalizedAngle() [5/6]

lsst::sphgeom::NormalizedAngle::NormalizedAngle ( LonLat const & p1,
LonLat const & p2 )

This constructor creates a NormalizedAngle equal to the angle between the given points on the unit sphere.

Definition at line 66 of file NormalizedAngle.cc.

66 {
67 double x = sin((p1.getLon() - p2.getLon()) * 0.5);
68 x *= x;
69 double y = sin((p1.getLat() - p2.getLat()) * 0.5);
70 y *= y;
71 double z = cos((p1.getLat() + p2.getLat()) * 0.5);
72 z *= z;
73 // Compute the square of the sine of half of the desired angle. This is
74 // easily shown to be be one fourth of the squared Euclidian distance
75 // (chord length) between p1 and p2.
76 double sha2 = (x * (z - y) + y);
77 // Avoid domain errors in asin and sqrt due to rounding errors.
78 if (sha2 < 0.0) {
79 _a = Angle(0.0);
80 } else if (sha2 >= 1.0) {
81 _a = Angle(PI);
82 } else {
83 _a = Angle(2.0 * std::asin(std::sqrt(sha2)));
84 }
85}
double z
Definition Match.cc:44
int y
Definition SpanSet.cc:48
T asin(T... args)
double sin(Angle const &a)
Definition Angle.h:109
double cos(Angle const &a)
Definition Angle.h:110
T sqrt(T... args)

◆ NormalizedAngle() [6/6]

lsst::sphgeom::NormalizedAngle::NormalizedAngle ( Vector3d const & v1,
Vector3d const & v2 )

This constructor creates a NormalizedAngle equal to the angle between the given 3-vectors, which need not have unit norm.

Definition at line 87 of file NormalizedAngle.cc.

87 {
88 double s = v1.cross(v2).getNorm();
89 double c = v1.dot(v2);
90 if (s == 0.0 && c == 0.0) {
91 // Avoid the atan2(±0, -0) = ±PI special case.
92 _a = Angle(0.0);
93 } else {
94 _a = Angle(std::atan2(s, c));
95 }
96}
T atan2(T... args)

Member Function Documentation

◆ asDegrees()

double lsst::sphgeom::NormalizedAngle::asDegrees ( ) const
inline

asDegrees returns the value of this angle in units of degrees.

Definition at line 134 of file NormalizedAngle.h.

134{ return _a.asDegrees(); }
double asDegrees() const
asDegrees returns the value of this angle in units of degrees.
Definition Angle.h:89

◆ asRadians()

double lsst::sphgeom::NormalizedAngle::asRadians ( ) const
inline

asRadians returns the value of this angle in units of radians.

Definition at line 137 of file NormalizedAngle.h.

137{ return _a.asRadians(); }
double asRadians() const
asRadians returns the value of this angle in units of radians.
Definition Angle.h:92

◆ between()

NormalizedAngle lsst::sphgeom::NormalizedAngle::between ( NormalizedAngle const & a,
NormalizedAngle const & b )
static

For two angles a and b, between(a, b) returns the smaller of a.getAngleTo(b) and b.getAngleTo(a).

The result will be in the range [0, π].

If one interprets an angle in [0, 2π) as a point on the unit circle, then between can be thought of as computing the arc length of the shortest unit circle segment between the points for a and b.

Definition at line 42 of file NormalizedAngle.cc.

44{
46 double a1 = std::fabs(a.asRadians() - b.asRadians());
47 double a2 = 2.0 * PI - a1;
48 x._a = Angle(std::min(a1, a2));
49 return x;
50}
table::Key< int > b
T fabs(T... args)
T min(T... args)

◆ center()

NormalizedAngle lsst::sphgeom::NormalizedAngle::center ( NormalizedAngle const & a,
NormalizedAngle const & b )
static

For two normalized angles a and b, center(a, b) returns the angle m such that a.getAngleTo(m) is equal to m.getAngleTo(b).

Definition at line 52 of file NormalizedAngle.cc.

54{
56 double c = 0.5 * (a.asRadians() + b.asRadians());
57 if (a <= b) {
58 x._a = Angle(c);
59 } else {
60 // The result is (a + b + 2π) / 2, normalized to [0, 2π)
61 x._a = Angle((c < PI) ? (c + PI) : (c - PI));
62 }
63 return x;
64}

◆ fromDegrees()

static NormalizedAngle lsst::sphgeom::NormalizedAngle::fromDegrees ( double a)
inlinestatic

Definition at line 56 of file NormalizedAngle.h.

56 {
57 return NormalizedAngle(a * RAD_PER_DEG);
58 }
constexpr double RAD_PER_DEG
Definition constants.h:45

◆ fromRadians()

static NormalizedAngle lsst::sphgeom::NormalizedAngle::fromRadians ( double a)
inlinestatic

Definition at line 60 of file NormalizedAngle.h.

60 {
61 return NormalizedAngle(a);
62 }

◆ getAngleTo()

NormalizedAngle lsst::sphgeom::NormalizedAngle::getAngleTo ( NormalizedAngle const & a) const
inline

getAngleTo computes the angle α ∈ [0, 2π) such that adding α to this angle and then normalizing the result yields a.

If one interprets an angle in [0, 2π) as a point on the unit circle, then this method can be thought of as computing the positive rotation angle required to map this point to a.

Definition at line 148 of file NormalizedAngle.h.

148 {
150 double d = a.asRadians() - asRadians();
151 x._a = Angle((d < 0.0) ? 2.0 * PI + d : d);
152 return x;
153 }
double asRadians() const
asRadians returns the value of this angle in units of radians.

◆ isNan()

bool lsst::sphgeom::NormalizedAngle::isNan ( ) const
inline

isNan returns true if the angle value is NaN.

Definition at line 140 of file NormalizedAngle.h.

140{ return _a.isNan(); }
bool isNan() const
isNan returns true if the angle value is NaN.
Definition Angle.h:98

◆ nan()

static NormalizedAngle lsst::sphgeom::NormalizedAngle::nan ( )
inlinestatic

◆ operator Angle const &()

lsst::sphgeom::NormalizedAngle::operator Angle const & ( ) const
inline

This conversion operator returns a const reference to the underlying Angle.

It allows a NormalizedAngle to transparently replace an Angle as an argument in most function calls.

Definition at line 115 of file NormalizedAngle.h.

115{ return _a; }

◆ operator!=()

bool lsst::sphgeom::NormalizedAngle::operator!= ( Angle const & a) const
inline

Definition at line 119 of file NormalizedAngle.h.

119{ return _a != a; }
table::Key< int > a

◆ operator*()

Angle lsst::sphgeom::NormalizedAngle::operator* ( double a) const
inline

Definition at line 129 of file NormalizedAngle.h.

129{ return _a * a; }

◆ operator+()

Angle lsst::sphgeom::NormalizedAngle::operator+ ( Angle const & a) const
inline

Definition at line 127 of file NormalizedAngle.h.

127{ return _a + a; }

◆ operator-() [1/2]

Angle lsst::sphgeom::NormalizedAngle::operator- ( ) const
inline

Definition at line 126 of file NormalizedAngle.h.

126{ return Angle(-_a); }

◆ operator-() [2/2]

Angle lsst::sphgeom::NormalizedAngle::operator- ( Angle const & a) const
inline

Definition at line 128 of file NormalizedAngle.h.

128{ return _a - a; }

◆ operator/() [1/2]

double lsst::sphgeom::NormalizedAngle::operator/ ( Angle const & a) const
inline

Definition at line 131 of file NormalizedAngle.h.

131{ return _a / a; }

◆ operator/() [2/2]

Angle lsst::sphgeom::NormalizedAngle::operator/ ( double a) const
inline

Definition at line 130 of file NormalizedAngle.h.

130{ return _a / a; }

◆ operator<()

bool lsst::sphgeom::NormalizedAngle::operator< ( Angle const & a) const
inline

Definition at line 120 of file NormalizedAngle.h.

120{ return _a < a; }

◆ operator<=()

bool lsst::sphgeom::NormalizedAngle::operator<= ( Angle const & a) const
inline

Definition at line 122 of file NormalizedAngle.h.

122{ return _a <= a; }

◆ operator==()

bool lsst::sphgeom::NormalizedAngle::operator== ( Angle const & a) const
inline

Definition at line 118 of file NormalizedAngle.h.

118{ return _a == a; }

◆ operator>()

bool lsst::sphgeom::NormalizedAngle::operator> ( Angle const & a) const
inline

Definition at line 121 of file NormalizedAngle.h.

121{ return _a > a; }

◆ operator>=()

bool lsst::sphgeom::NormalizedAngle::operator>= ( Angle const & a) const
inline

Definition at line 123 of file NormalizedAngle.h.

123{ return _a >= a; }

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