NumCpp  2.1.0
A C++ implementation of the Python Numpy library
Coordinate.hpp
Go to the documentation of this file.
1 #pragma once
30 
34 #include "NumCpp/Core/Types.hpp"
36 #include "NumCpp/Functions/dot.hpp"
38 #include "NumCpp/NdArray.hpp"
39 #include "NumCpp/Utils/sqr.hpp"
40 
41 #include <cmath>
42 #include <iostream>
43 #include <string>
44 
45 namespace nc
46 {
47  namespace coordinates
48  {
49  //================================================================================
51  class Coordinate
52  {
53  public:
54  //============================================================================
57  Coordinate() = default;
58 
59  //============================================================================
65  Coordinate(double inRaDegrees, double inDecDegrees) :
66  ra_(inRaDegrees),
67  dec_(inDecDegrees)
68  {
69  polarToCartesian();
70  }
71 
72  //============================================================================
83  Coordinate(uint8 inRaHours, uint8 inRaMinutes, double inRaSeconds, Sign inSign,
84  uint8 inDecDegreesWhole, uint8 inDecMinutes, double inDecSeconds) :
85  ra_(inRaHours, inRaMinutes, inRaSeconds),
86  dec_(inSign, inDecDegreesWhole, inDecMinutes, inDecSeconds)
87  {
88  polarToCartesian();
89  }
90 
91  //============================================================================
97  Coordinate(const RA& inRA, const Dec& inDec) noexcept :
98  ra_(inRA),
99  dec_(inDec)
100  {
101  polarToCartesian();
102  }
103 
104  //============================================================================
111  Coordinate(double inX, double inY, double inZ) noexcept :
112  x_(inX),
113  y_(inY),
114  z_(inZ)
115  {
116  cartesianToPolar();
117  }
118 
119  //============================================================================
124  Coordinate(const NdArray<double>& inCartesianVector)
125  {
126  if (inCartesianVector.size() != 3)
127  {
128  THROW_INVALID_ARGUMENT_ERROR("NdArray input must be of length 3.");
129  }
130 
131  x_ = inCartesianVector[0];
132  y_ = inCartesianVector[1];
133  z_ = inCartesianVector[2];
134 
135  cartesianToPolar();
136  }
137 
138  //============================================================================
143  const Dec& dec() const noexcept
144  {
145  return dec_;
146  }
147 
148  //============================================================================
153  const RA& ra() const noexcept
154  {
155  return ra_;
156  }
157 
158  //============================================================================
163  double x() const noexcept
164  {
165  return x_;
166  }
167 
168  //============================================================================
173  double y() const noexcept
174  {
175  return y_;
176  }
177 
178  //============================================================================
183  double z() const noexcept
184  {
185  return z_;
186  }
187 
188  //============================================================================
194  {
195  NdArray<double> out = { x_, y_, z_ };
196  return out;
197  }
198 
199  //============================================================================
206  double degreeSeperation(const Coordinate& inOtherCoordinate) const
207  {
208  return rad2deg(radianSeperation(inOtherCoordinate));
209  }
210 
211  //============================================================================
219  double degreeSeperation(const NdArray<double>& inVector) const
220  {
221  return rad2deg(radianSeperation(inVector));
222  }
223 
224  //============================================================================
231  double radianSeperation(const Coordinate& inOtherCoordinate) const
232  {
233  return std::acos(dot(xyz(), inOtherCoordinate.xyz()).item());
234  }
235 
236  //============================================================================
244  double radianSeperation(const NdArray<double>& inVector) const
245  {
246  if (inVector.size() != 3)
247  {
248  THROW_INVALID_ARGUMENT_ERROR("input vector must be of length 3.");
249  }
250 
251  return std::acos(dot(xyz(), inVector.flatten()).item());
252  }
253 
254  //============================================================================
259  std::string str() const
260  {
261  std::string returnStr;
262  returnStr = ra_.str();
263  returnStr += dec_.str();
264  returnStr += "Cartesian = " + xyz().str();
265  return returnStr;
266  }
267 
268  //============================================================================
271  void print() const
272  {
273  std::cout << *this;
274  }
275 
276  //============================================================================
283  bool operator==(const Coordinate& inRhs) const noexcept
284  {
285  return ra_ == inRhs.ra_ && dec_ == inRhs.dec_;
286  }
287 
288  //============================================================================
295  bool operator!=(const Coordinate& inRhs) const noexcept
296  {
297  return !(*this == inRhs);
298  }
299 
300  //============================================================================
308  friend std::ostream& operator<<(std::ostream& inStream, const Coordinate& inCoord)
309  {
310  inStream << inCoord.str();
311  return inStream;
312  }
313 
314  private:
315  //====================================Attributes==============================
316  RA ra_{};
317  Dec dec_{};
318  double x_{ 1.0 };
319  double y_{ 0.0 };
320  double z_{ 0.0 };
321 
322  //============================================================================
325  void cartesianToPolar() noexcept
326  {
327  double degreesRa = rad2deg(std::atan2(y_, x_));
328  if (degreesRa < 0)
329  {
330  degreesRa += 360;
331  }
332  ra_ = RA(degreesRa);
333 
334  const double r = std::sqrt(utils::sqr(x_) + utils::sqr(y_) + utils::sqr(z_));
335  const double degreesDec = rad2deg(std::asin(z_ / r));
336  dec_ = Dec(degreesDec);
337  }
338 
339  //============================================================================
342  void polarToCartesian() noexcept
343  {
344  const double raRadians = deg2rad(ra_.degrees());
345  const double decRadians = deg2rad(dec_.degrees());
346 
347  x_ = std::cos(raRadians) * std::cos(decRadians);
348  y_ = std::sin(raRadians) * std::cos(decRadians);
349  z_ = std::sin(decRadians);
350  }
351  };
352  } // namespace coordinates
353 } // namespace nc
nc::coordinates::Coordinate::degreeSeperation
double degreeSeperation(const NdArray< double > &inVector) const
Definition: Coordinate.hpp:219
nc::NdArray::item
value_type item() const
Definition: NdArrayCore.hpp:2958
nc::coordinates::Coordinate::degreeSeperation
double degreeSeperation(const Coordinate &inOtherCoordinate) const
Definition: Coordinate.hpp:206
nc::coordinates::Coordinate::dec
const Dec & dec() const noexcept
Definition: Coordinate.hpp:143
deg2rad.hpp
Error.hpp
nc::coordinates::Coordinate::y
double y() const noexcept
Definition: Coordinate.hpp:173
Dec.hpp
nc::sqrt
auto sqrt(dtype inValue) noexcept
Definition: sqrt.hpp:51
nc::coordinates::Coordinate::str
std::string str() const
Definition: Coordinate.hpp:259
nc::coordinates::RA
Holds a right ascension object.
Definition: RA.hpp:47
nc::coordinates::Coordinate::ra
const RA & ra() const noexcept
Definition: Coordinate.hpp:153
nc::uint8
std::uint8_t uint8
Definition: Types.hpp:43
nc::coordinates::Coordinate::operator==
bool operator==(const Coordinate &inRhs) const noexcept
Definition: Coordinate.hpp:283
nc::dot
NdArray< dtype > dot(const NdArray< dtype > &inArray1, const NdArray< dtype > &inArray2)
Definition: dot.hpp:48
nc::NdArray< double >
nc::coordinates::Coordinate::print
void print() const
Definition: Coordinate.hpp:271
nc::deg2rad
constexpr auto deg2rad(dtype inValue) noexcept
Definition: deg2rad.hpp:50
nc::cos
auto cos(dtype inValue) noexcept
Definition: cos.hpp:52
nc::coordinates::Coordinate::Coordinate
Coordinate(const RA &inRA, const Dec &inDec) noexcept
Definition: Coordinate.hpp:97
nc::coordinates::Coordinate::radianSeperation
double radianSeperation(const Coordinate &inOtherCoordinate) const
Definition: Coordinate.hpp:231
nc::NdArray::str
std::string str() const
Definition: NdArrayCore.hpp:4389
NdArray.hpp
nc::rad2deg
constexpr auto rad2deg(dtype inValue) noexcept
Definition: rad2deg.hpp:51
dot.hpp
nc::coordinates::Coordinate::operator!=
bool operator!=(const Coordinate &inRhs) const noexcept
Definition: Coordinate.hpp:295
nc::coordinates::Coordinate::Coordinate
Coordinate(double inRaDegrees, double inDecDegrees)
Definition: Coordinate.hpp:65
nc::coordinates::Coordinate::xyz
NdArray< double > xyz() const
Definition: Coordinate.hpp:193
nc::NdArray::size
size_type size() const noexcept
Definition: NdArrayCore.hpp:4326
nc::coordinates::Dec
Holds a Declination object.
Definition: Dec.hpp:51
nc::sin
auto sin(dtype inValue) noexcept
Definition: sin.hpp:52
nc::NdArray::flatten
NdArray< dtype > flatten() const
Definition: NdArrayCore.hpp:2775
nc
Definition: Coordinate.hpp:45
nc::coordinates::Coordinate
Holds a full coordinate object.
Definition: Coordinate.hpp:51
nc::coordinates::Coordinate::x
double x() const noexcept
Definition: Coordinate.hpp:163
nc::coordinates::RA::str
std::string str() const
Definition: RA.hpp:146
nc::coordinates::Coordinate::Coordinate
Coordinate()=default
nc::coordinates::Dec::degrees
double degrees() const noexcept
Definition: Dec.hpp:117
sqr.hpp
nc::coordinates::Coordinate::radianSeperation
double radianSeperation(const NdArray< double > &inVector) const
Definition: Coordinate.hpp:244
THROW_INVALID_ARGUMENT_ERROR
#define THROW_INVALID_ARGUMENT_ERROR(msg)
Definition: Error.hpp:37
nc::coordinates::RA::degrees
double degrees() const noexcept
Definition: RA.hpp:106
nc::coordinates::Coordinate::Coordinate
Coordinate(const NdArray< double > &inCartesianVector)
Definition: Coordinate.hpp:124
rad2deg.hpp
RA.hpp
nc::utils::sqr
constexpr dtype sqr(dtype inValue) noexcept
Definition: sqr.hpp:45
nc::coordinates::Dec::str
std::string str() const
Definition: Dec.hpp:167
nc::coordinates::Coordinate::Coordinate
Coordinate(uint8 inRaHours, uint8 inRaMinutes, double inRaSeconds, Sign inSign, uint8 inDecDegreesWhole, uint8 inDecMinutes, double inDecSeconds)
Definition: Coordinate.hpp:83
nc::coordinates::Coordinate::z
double z() const noexcept
Definition: Coordinate.hpp:183
Types.hpp
nc::coordinates::Coordinate::operator<<
friend std::ostream & operator<<(std::ostream &inStream, const Coordinate &inCoord)
Definition: Coordinate.hpp:308
nc::coordinates::Coordinate::Coordinate
Coordinate(double inX, double inY, double inZ) noexcept
Definition: Coordinate.hpp:111
nc::coordinates::Sign
Sign
Struct Enum for positive or negative Dec angle.
Definition: Dec.hpp:47