LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
LSST Data Management Base Package
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 ()
 This constructor creates a NormalizedAngle with a value of zero. More...
 
 NormalizedAngle (NormalizedAngle const &a)
 This constructor creates a copy of a. More...
 
 NormalizedAngle (Angle const &a)
 This constructor creates a normalized copy of a. More...
 
 NormalizedAngle (double a)
 This constructor creates a NormalizedAngle with the given value in radians, normalized to be in the range [0, 2π). More...
 
 NormalizedAngle (LonLat const &, LonLat const &)
 This constructor creates a NormalizedAngle equal to the angle between the given points on the unit sphere. More...
 
 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. More...
 
 operator Angle const & () const
 This conversion operator returns a const reference to the underlying Angle. More...
 
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. More...
 
double asRadians () const
 asRadians returns the value of this angle in units of radians. More...
 
bool isNan () const
 isNan returns true if the angle value is NaN. More...
 
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. More...
 

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). More...
 
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). More...
 

Detailed Description

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

Definition at line 41 of file NormalizedAngle.h.

Constructor & Destructor Documentation

◆ NormalizedAngle() [1/6]

lsst::sphgeom::NormalizedAngle::NormalizedAngle ( )
inline

This constructor creates a NormalizedAngle with a value of zero.

Definition at line 71 of file NormalizedAngle.h.

71 {}

◆ NormalizedAngle() [2/6]

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

This constructor creates a copy of a.

Definition at line 74 of file NormalizedAngle.h.

74 : _a(a._a) {}
table::Key< int > a

◆ NormalizedAngle() [3/6]

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

This constructor creates a normalized copy of a.

Definition at line 77 of file NormalizedAngle.h.

77  {
78  *this = NormalizedAngle(a.asRadians());
79  }
NormalizedAngle()
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 83 of file NormalizedAngle.h.

83  {
84  // For really large |a|, the error in this reduction can exceed 2*PI
85  // (because PI is only an approximation to π).
86  if (a < 0.0) {
87  _a = Angle(std::fmod(a, 2.0 * PI) + 2.0 * PI);
88  } else if (a > 2 * PI) {
89  _a = Angle(std::fmod(a, 2.0 * PI));
90  } else {
91  _a = Angle(a);
92  }
93  }
T fmod(T... args)
lsst::geom::Angle Angle
Definition: misc.h:33
constexpr double PI
Definition: constants.h:36

◆ 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 59 of file NormalizedAngle.cc.

59  {
60  double x = sin((p1.getLon() - p2.getLon()) * 0.5);
61  x *= x;
62  double y = sin((p1.getLat() - p2.getLat()) * 0.5);
63  y *= y;
64  double z = cos((p1.getLat() + p2.getLat()) * 0.5);
65  z *= z;
66  // Compute the square of the sine of half of the desired angle. This is
67  // easily shown to be be one fourth of the squared Euclidian distance
68  // (chord length) between p1 and p2.
69  double sha2 = (x * (z - y) + y);
70  // Avoid domain errors in asin and sqrt due to rounding errors.
71  if (sha2 < 0.0) {
72  _a = Angle(0.0);
73  } else if (sha2 >= 1.0) {
74  _a = Angle(PI);
75  } else {
76  _a = Angle(2.0 * std::asin(std::sqrt(sha2)));
77  }
78 }
double x
double z
Definition: Match.cc:44
int y
Definition: SpanSet.cc:48
T asin(T... args)
double sin(Angle const &a)
Definition: Angle.h:102
double cos(Angle const &a)
Definition: Angle.h:103
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 80 of file NormalizedAngle.cc.

80  {
81  double s = v1.cross(v2).getNorm();
82  double c = v1.dot(v2);
83  if (s == 0.0 && c == 0.0) {
84  // Avoid the atan2(±0, -0) = ±PI special case.
85  _a = Angle(0.0);
86  } else {
87  _a = Angle(std::atan2(s, c));
88  }
89 }
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 125 of file NormalizedAngle.h.

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

◆ asRadians()

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

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

Definition at line 128 of file NormalizedAngle.h.

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

◆ 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 35 of file NormalizedAngle.cc.

37 {
39  double a1 = std::fabs(a.asRadians() - b.asRadians());
40  double a2 = 2.0 * PI - a1;
41  x._a = Angle(std::min(a1, a2));
42  return x;
43 }
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 45 of file NormalizedAngle.cc.

47 {
49  double c = 0.5 * (a.asRadians() + b.asRadians());
50  if (a <= b) {
51  x._a = Angle(c);
52  } else {
53  // The result is (a + b + 2π) / 2, normalized to [0, 2π)
54  x._a = Angle((c < PI) ? (c + PI) : (c - PI));
55  }
56  return x;
57 }

◆ fromDegrees()

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

Definition at line 47 of file NormalizedAngle.h.

47  {
48  return NormalizedAngle(a * RAD_PER_DEG);
49  }
constexpr double RAD_PER_DEG
Definition: constants.h:38

◆ fromRadians()

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

Definition at line 51 of file NormalizedAngle.h.

51  {
52  return NormalizedAngle(a);
53  }

◆ 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 139 of file NormalizedAngle.h.

139  {
141  double d = a.asRadians() - asRadians();
142  x._a = Angle((d < 0.0) ? 2.0 * PI + d : d);
143  return x;
144  }
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 131 of file NormalizedAngle.h.

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

◆ nan()

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

Definition at line 43 of file NormalizedAngle.h.

◆ 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 106 of file NormalizedAngle.h.

106 { return _a; }

◆ operator!=()

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

Definition at line 110 of file NormalizedAngle.h.

110 { return _a != a; }

◆ operator*()

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

Definition at line 120 of file NormalizedAngle.h.

120 { return _a * a; }

◆ operator+()

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

Definition at line 118 of file NormalizedAngle.h.

118 { return _a + a; }

◆ operator-() [1/2]

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

Definition at line 117 of file NormalizedAngle.h.

117 { return Angle(-_a); }

◆ operator-() [2/2]

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

Definition at line 119 of file NormalizedAngle.h.

119 { return _a - a; }

◆ operator/() [1/2]

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

Definition at line 122 of file NormalizedAngle.h.

122 { return _a / a; }

◆ operator/() [2/2]

Angle lsst::sphgeom::NormalizedAngle::operator/ ( double  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 111 of file NormalizedAngle.h.

111 { return _a < a; }

◆ operator<=()

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

Definition at line 113 of file NormalizedAngle.h.

113 { return _a <= a; }

◆ operator==()

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

Definition at line 109 of file NormalizedAngle.h.

109 { return _a == a; }

◆ operator>()

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

Definition at line 112 of file NormalizedAngle.h.

112 { return _a > a; }

◆ operator>=()

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

Definition at line 114 of file NormalizedAngle.h.

114 { return _a >= a; }

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