LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Member Functions | Static Public Member Functions | List of all members
lsst::sphgeom::UnitVector3d Class Reference

UnitVector3d is a unit vector in ℝ³ with components stored in double precision. More...

#include <UnitVector3d.h>

Public Member Functions

 UnitVector3d ()
 The default constructor creates a unit vector equal to (1, 0, 0). More...
 
 UnitVector3d (UnitVector3d const &v)=default
 
 UnitVector3d (LonLat const &p)
 This constructor creates the unit vector corresponding to the point p on the unit sphere. More...
 
 UnitVector3d (Angle lon, Angle lat)
 This constructor creates a unit vector corresponding to the given spherical coordinates. More...
 
 operator Vector3d const & () const
 This conversion operator returns a const reference to the underlying Vector3d. More...
 
bool operator== (Vector3d const &v) const
 
bool operator!= (Vector3d const &v) const
 
double const * getData () const
 getData returns a pointer to the 3 components of this unit vector. More...
 
double operator() (int i) const
 The function call operator returns the i-th component of this vector. More...
 
double x () const
 
double y () const
 
double z () const
 
double dot (Vector3d const &v) const
 dot returns the inner product of this unit vector and v. More...
 
Vector3d cross (Vector3d const &v) const
 cross returns the cross product of this unit vector and v. More...
 
Vector3d robustCross (UnitVector3d const &v) const
 a.robustCross(b) is (b + a).cross(b - a) - twice the cross product of a and b. More...
 
UnitVector3d operator- () const
 The unary minus operator negates every component of this unit vector. More...
 
Vector3d operator* (double s) const
 The multiplication operator returns the component-wise product of this unit vector with scalar s. More...
 
Vector3d operator/ (double s) const
 The division operator returns the component-wise quotient of this unit vector with scalar s. More...
 
Vector3d operator+ (Vector3d const &v) const
 The addition operator returns the sum of this unit vector and v. More...
 
Vector3d operator- (Vector3d const &v) const
 The subtraction operator returns the difference between this unit vector and v. More...
 
Vector3d cwiseProduct (Vector3d const &v) const
 cwiseProduct returns the component-wise product of this unit vector and v. More...
 
UnitVector3d rotatedAround (UnitVector3d const &k, Angle a) const
 rotatedAround returns a copy of this unit vector, rotated around the unit vector k by angle a according to the right hand rule. More...
 
 UnitVector3d (Vector3d const &v)
 
 UnitVector3d (double x, double y, double z)
 

Static Public Member Functions

static UnitVector3d orthogonalTo (Vector3d const &v)
 orthogonalTo returns an arbitrary unit vector that is orthogonal to v. More...
 
static UnitVector3d orthogonalTo (Vector3d const &v1, Vector3d const &v2)
 orthogonalTo returns the unit vector n orthogonal to both v1 and v2 and with the same direction as the cross product of v1 and v2. More...
 
static UnitVector3d northFrom (Vector3d const &v)
 northFrom returns the unit vector orthogonal to v that points "north" from v. More...
 
static UnitVector3d orthogonalTo (NormalizedAngle const &a)
 orthogonalTo returns the unit vector orthogonal to the meridian with the given longitude. More...
 
static UnitVector3d fromNormalized (Vector3d const &v)
 fromNormalized returns the unit vector equal to v, which is assumed to be normalized. More...
 
static UnitVector3d fromNormalized (double x, double y, double z)
 fromNormalized returns the unit vector with the given components, which are assumed to correspond to those of a normalized vector. More...
 
static UnitVector3d X ()
 
static UnitVector3d Y ()
 
static UnitVector3d Z ()
 

Detailed Description

UnitVector3d is a unit vector in ℝ³ with components stored in double precision.

Conceptually, a UnitVector3d is a Vector3d. However, it does not inherit from Vector3d because all its mutators must correspond to isometries. Propagating this restriction to the Vector3d base class would make the base class unduly difficult to use. Furthermore, the base class assignment operator would have to be made virtual - otherwise it would be possible to cast a UnitVector3d reference to a Vector3d reference and then assign components yielding non-unit norm. For a class this compact and performance critical, the addition of a vtable pointer per instance and the potential for virtual call overhead on assignment is deemed prohibitive.

This class supports conversion from longitude and latitude angles. All methods that accept a LonLat or equivalent angles shall convert from longitude/latitude to a unit vector according to the following conventions:

Definition at line 55 of file UnitVector3d.h.

Constructor & Destructor Documentation

◆ UnitVector3d() [1/6]

lsst::sphgeom::UnitVector3d::UnitVector3d ( )
inline

The default constructor creates a unit vector equal to (1, 0, 0).

Definition at line 106 of file UnitVector3d.h.

106 : _v(1.0, 0.0, 0.0) {}

◆ UnitVector3d() [2/6]

lsst::sphgeom::UnitVector3d::UnitVector3d ( UnitVector3d const &  v)
default

◆ UnitVector3d() [3/6]

lsst::sphgeom::UnitVector3d::UnitVector3d ( Vector3d const &  v)
inlineexplicit

This constructor creates a unit vector with the given direction.

Definition at line 112 of file UnitVector3d.h.

112  : _v(v) {
113  _v.normalize();
114  }
double normalize()
normalize scales this vector to have unit norm and returns its norm prior to scaling.
Definition: Vector3d.cc:41

◆ UnitVector3d() [4/6]

lsst::sphgeom::UnitVector3d::UnitVector3d ( double  x,
double  y,
double  z 
)
inline

This constructor creates a unit vector with the given direction.

Definition at line 116 of file UnitVector3d.h.

116  : _v(x, y, z) {
117  _v.normalize();
118  }

◆ UnitVector3d() [5/6]

lsst::sphgeom::UnitVector3d::UnitVector3d ( LonLat const &  p)
inlineexplicit

This constructor creates the unit vector corresponding to the point p on the unit sphere.

Definition at line 123 of file UnitVector3d.h.

123  {
124  *this = UnitVector3d(p.getLon(), p.getLat());
125  }
UnitVector3d()
The default constructor creates a unit vector equal to (1, 0, 0).
Definition: UnitVector3d.h:106

◆ UnitVector3d() [6/6]

lsst::sphgeom::UnitVector3d::UnitVector3d ( Angle  lon,
Angle  lat 
)

This constructor creates a unit vector corresponding to the given spherical coordinates.

Definition at line 63 of file UnitVector3d.cc.

63  {
64  double sinLon = sin(lon);
65  double cosLon = cos(lon);
66  double sinLat = sin(lat);
67  double cosLat = cos(lat);
68  _v = Vector3d(cosLon * cosLat,
69  sinLon * cosLat,
70  sinLat);
71 }
double sin(Angle const &a)
Definition: Angle.h:102
double cos(Angle const &a)
Definition: Angle.h:103

Member Function Documentation

◆ cross()

Vector3d lsst::sphgeom::UnitVector3d::cross ( Vector3d const &  v) const
inline

cross returns the cross product of this unit vector and v.

Definition at line 155 of file UnitVector3d.h.

155 { return _v.cross(v); }
Vector3d cross(Vector3d const &v) const
cross returns the cross product of this vector and v.
Definition: Vector3d.h:101

◆ cwiseProduct()

Vector3d lsst::sphgeom::UnitVector3d::cwiseProduct ( Vector3d const &  v) const
inline

cwiseProduct returns the component-wise product of this unit vector and v.

Definition at line 187 of file UnitVector3d.h.

187  {
188  return _v.cwiseProduct(v);
189  }
Vector3d cwiseProduct(Vector3d const &v) const
cwiseProduct returns the component-wise product of this vector and v.
Definition: Vector3d.h:150

◆ dot()

double lsst::sphgeom::UnitVector3d::dot ( Vector3d const &  v) const
inline

dot returns the inner product of this unit vector and v.

Definition at line 152 of file UnitVector3d.h.

152 { return _v.dot(v); }
double dot(Vector3d const &v) const
dot returns the inner product of this vector and v.
Definition: Vector3d.h:73

◆ fromNormalized() [1/2]

static UnitVector3d lsst::sphgeom::UnitVector3d::fromNormalized ( double  x,
double  y,
double  z 
)
inlinestatic

fromNormalized returns the unit vector with the given components, which are assumed to correspond to those of a normalized vector.

Use with caution - this assumption is not verified!

Definition at line 89 of file UnitVector3d.h.

89  {
90  UnitVector3d u; u._v = Vector3d(x, y, z); return u;
91  }

◆ fromNormalized() [2/2]

static UnitVector3d lsst::sphgeom::UnitVector3d::fromNormalized ( Vector3d const &  v)
inlinestatic

fromNormalized returns the unit vector equal to v, which is assumed to be normalized.

Use with caution - this assumption is not verified!

Definition at line 82 of file UnitVector3d.h.

82  {
83  UnitVector3d u; u._v = v; return u;
84  }

◆ getData()

double const* lsst::sphgeom::UnitVector3d::getData ( ) const
inline

getData returns a pointer to the 3 components of this unit vector.

Definition at line 140 of file UnitVector3d.h.

140 { return _v.getData(); }
double const * getData() const
data returns a pointer to the 3 components of this vector.
Definition: Vector3d.h:61

◆ northFrom()

UnitVector3d lsst::sphgeom::UnitVector3d::northFrom ( Vector3d const &  v)
static

northFrom returns the unit vector orthogonal to v that points "north" from v.

More precisely, it returns a unit vector orthogonal to v that lies in the plane defined by v, the north pole (0, 0, 1), and the origin. If v is colinear with the z axis, then (-1, 0, 0) is returned if v points north, and (1, 0, 0) is returned if v points south.

Definition at line 51 of file UnitVector3d.cc.

51  {
52  Vector3d n(-v.x() * v.z(),
53  -v.y() * v.z(),
54  v.x() * v.x() + v.y() * v.y());
55  if (n.isZero()) {
56  UnitVector3d u;
57  u._v = Vector3d(-::copysign(1.0, v.z()), 0.0, 0.0);
58  return u;
59  }
60  return UnitVector3d(n);
61 }
T copysign(T... args)

◆ operator Vector3d const &()

lsst::sphgeom::UnitVector3d::operator Vector3d const & ( ) const
inline

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

It allows a UnitVector3d to transparently replace a Vector3d as an argument in most function calls.

Definition at line 134 of file UnitVector3d.h.

134 { return _v; }

◆ operator!=()

bool lsst::sphgeom::UnitVector3d::operator!= ( Vector3d const &  v) const
inline

Definition at line 137 of file UnitVector3d.h.

137 { return _v != v; }

◆ operator()()

double lsst::sphgeom::UnitVector3d::operator() ( int  i) const
inline

The function call operator returns the i-th component of this vector.

Definition at line 143 of file UnitVector3d.h.

143 { return _v(i); }

◆ operator*()

Vector3d lsst::sphgeom::UnitVector3d::operator* ( double  s) const
inline

The multiplication operator returns the component-wise product of this unit vector with scalar s.

Definition at line 172 of file UnitVector3d.h.

172 { return _v * s; }

◆ operator+()

Vector3d lsst::sphgeom::UnitVector3d::operator+ ( Vector3d const &  v) const
inline

The addition operator returns the sum of this unit vector and v.

Definition at line 179 of file UnitVector3d.h.

179 { return _v + v; }

◆ operator-() [1/2]

UnitVector3d lsst::sphgeom::UnitVector3d::operator- ( ) const
inline

The unary minus operator negates every component of this unit vector.

Definition at line 166 of file UnitVector3d.h.

166  {
167  UnitVector3d u; u._v = -_v; return u;
168  }

◆ operator-() [2/2]

Vector3d lsst::sphgeom::UnitVector3d::operator- ( Vector3d const &  v) const
inline

The subtraction operator returns the difference between this unit vector and v.

Definition at line 183 of file UnitVector3d.h.

183 { return _v - v; }

◆ operator/()

Vector3d lsst::sphgeom::UnitVector3d::operator/ ( double  s) const
inline

The division operator returns the component-wise quotient of this unit vector with scalar s.

Definition at line 176 of file UnitVector3d.h.

176 { return _v / s; }

◆ operator==()

bool lsst::sphgeom::UnitVector3d::operator== ( Vector3d const &  v) const
inline

Definition at line 136 of file UnitVector3d.h.

136 { return _v == v; }

◆ orthogonalTo() [1/3]

static UnitVector3d lsst::sphgeom::UnitVector3d::orthogonalTo ( NormalizedAngle const &  a)
inlinestatic

orthogonalTo returns the unit vector orthogonal to the meridian with the given longitude.

Definition at line 76 of file UnitVector3d.h.

76  {
77  UnitVector3d u; u._v = Vector3d(-sin(a), cos(a), 0.0); return u;
78  }
table::Key< int > a

◆ orthogonalTo() [2/3]

UnitVector3d lsst::sphgeom::UnitVector3d::orthogonalTo ( Vector3d const &  v)
static

orthogonalTo returns an arbitrary unit vector that is orthogonal to v.

Definition at line 34 of file UnitVector3d.cc.

34  {
35  if (std::fabs(v.x()) > std::fabs(v.y())) {
36  return UnitVector3d(-v.z(), 0.0, v.x());
37  }
38  return UnitVector3d(0.0, v.z(), -v.y());
39 }
T fabs(T... args)

◆ orthogonalTo() [3/3]

UnitVector3d lsst::sphgeom::UnitVector3d::orthogonalTo ( Vector3d const &  v1,
Vector3d const &  v2 
)
static

orthogonalTo returns the unit vector n orthogonal to both v1 and v2 and with the same direction as the cross product of v1 and v2.

If v1 and v2 are nearly (anti)parallel, then an arbitrary unit vector orthogonal to v1 is returned.

Definition at line 41 of file UnitVector3d.cc.

43 {
44  Vector3d n = (v2 + v1).cross(v2 - v1);
45  if (n.isZero()) {
46  return orthogonalTo(v1);
47  }
48  return UnitVector3d(n);
49 }
static UnitVector3d orthogonalTo(Vector3d const &v)
orthogonalTo returns an arbitrary unit vector that is orthogonal to v.
Definition: UnitVector3d.cc:34
Vector3d cross(Vector3d const &v) const
cross returns the cross product of this unit vector and v.
Definition: UnitVector3d.h:155

◆ robustCross()

Vector3d lsst::sphgeom::UnitVector3d::robustCross ( UnitVector3d const &  v) const
inline

a.robustCross(b) is (b + a).cross(b - a) - twice the cross product of a and b.

The result is almost orthogonal to a and b even for nearly (anti-)parallel unit vectors. The idea comes from the Google S2 library.

Definition at line 161 of file UnitVector3d.h.

161  {
162  return (v + *this).cross(v - *this);
163  }

◆ rotatedAround()

UnitVector3d lsst::sphgeom::UnitVector3d::rotatedAround ( UnitVector3d const &  k,
Angle  a 
) const
inline

rotatedAround returns a copy of this unit vector, rotated around the unit vector k by angle a according to the right hand rule.

Definition at line 193 of file UnitVector3d.h.

193  {
194  return UnitVector3d(_v.rotatedAround(k, a));
195  }
Vector3d rotatedAround(UnitVector3d const &k, Angle a) const
rotatedAround returns a copy of this vector, rotated around the unit vector k by angle a according to...
Definition: Vector3d.cc:125

◆ X()

static UnitVector3d lsst::sphgeom::UnitVector3d::X ( )
inlinestatic

Definition at line 93 of file UnitVector3d.h.

93  {
94  return UnitVector3d();
95  }

◆ x()

double lsst::sphgeom::UnitVector3d::x ( ) const
inline

Definition at line 145 of file UnitVector3d.h.

145 { return _v.x(); }
double x() const
Definition: Vector3d.h:66

◆ Y()

static UnitVector3d lsst::sphgeom::UnitVector3d::Y ( )
inlinestatic

Definition at line 97 of file UnitVector3d.h.

97  {
98  UnitVector3d u; u._v = Vector3d(0.0, 1.0, 0.0); return u;
99  }

◆ y()

double lsst::sphgeom::UnitVector3d::y ( ) const
inline

Definition at line 147 of file UnitVector3d.h.

147 { return _v.y(); }
double y() const
Definition: Vector3d.h:68

◆ Z()

static UnitVector3d lsst::sphgeom::UnitVector3d::Z ( )
inlinestatic

Definition at line 101 of file UnitVector3d.h.

101  {
102  UnitVector3d u; u._v = Vector3d(0.0, 0.0, 1.0); return u;
103  }

◆ z()

double lsst::sphgeom::UnitVector3d::z ( ) const
inline

Definition at line 149 of file UnitVector3d.h.

149 { return _v.z(); }
double z() const
Definition: Vector3d.h:70

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