NumCpp  2.10.1
A Templatized Header Only C++ Implementation of the Python NumPy Library
RA.hpp
Go to the documentation of this file.
1 #pragma once
29 
30 #include <cmath>
31 #include <iostream>
32 #include <string>
33 
35 #include "NumCpp/Core/Types.hpp"
38 #include "NumCpp/Utils/num2str.hpp"
39 
40 namespace nc::coordinates
41 {
42  //================================================================================
44  class RA
45  {
46  public:
47  //============================================================================
50  RA() = default;
51 
52  //============================================================================
57  explicit RA(double inDegrees) :
58  degrees_(inDegrees),
59  radians_(deg2rad(inDegrees))
60  {
61  if (inDegrees < 0 || inDegrees >= 360)
62  {
63  THROW_INVALID_ARGUMENT_ERROR("input degrees must be of the range [0, 360)");
64  }
65 
66  hours_ = static_cast<uint8>(std::floor(degrees_ / 15.));
67  const double decMinutes = (degrees_ - static_cast<double>(hours_) * 15.) * 4.;
68  minutes_ = static_cast<uint8>(std::floor(decMinutes));
69  seconds_ = static_cast<double>((decMinutes - static_cast<double>(minutes_)) * 60.);
70  }
71 
72  //============================================================================
79  RA(uint8 inHours, uint8 inMinutes, double inSeconds)
80  noexcept :
81  hours_(inHours),
82  minutes_(inMinutes),
83  seconds_(inSeconds)
84  {
85  degrees_ = static_cast<double>(hours_) * 15. + static_cast<double>(minutes_) / 4. + seconds_ / 240.;
86  radians_ = deg2rad(degrees_);
87  }
88 
89  //============================================================================
94  [[nodiscard]] double radians() const noexcept
95  {
96  return radians_;
97  }
98 
99  //============================================================================
104  [[nodiscard]] double degrees() const noexcept
105  {
106  return degrees_;
107  }
108 
109  //============================================================================
114  [[nodiscard]] uint8 hours() const noexcept
115  {
116  return hours_;
117  }
118 
119  //============================================================================
124  [[nodiscard]] uint8 minutes() const noexcept
125  {
126  return minutes_;
127  }
128 
129  //============================================================================
134  [[nodiscard]] double seconds() const noexcept
135  {
136  return seconds_;
137  }
138 
139  //============================================================================
144  [[nodiscard]] std::string str() const
145  {
146  std::string out =
147  "RA hms: " + utils::num2str(hours_) + " hours, " + utils::num2str(minutes_) + " minutes, ";
148  out += utils::num2str(seconds_) + " seconds\nRA degrees: " + utils::num2str(degrees_) + '\n';
149  return out;
150  }
151 
152  //============================================================================
155  void print() const
156  {
157  std::cout << *this;
158  }
159 
160  //============================================================================
167  bool operator==(const RA& inRhs) const noexcept
168  {
169  return utils::essentiallyEqual(degrees_, inRhs.degrees_);
170  }
171 
172  //============================================================================
179  bool operator!=(const RA& inRhs) const noexcept
180  {
181  return !(*this == inRhs);
182  }
183 
184  //============================================================================
190  friend std::ostream& operator<<(std::ostream& inStream, const RA& inRa)
191  {
192  inStream << inRa.str();
193  return inStream;
194  }
195 
196  private:
197  //====================================Attributes==============================
198  uint8 hours_{ 0 };
199  uint8 minutes_{ 0 };
200  double seconds_{ 0. };
201  double degrees_{ 0. };
202  double radians_{ 0. };
203  };
204 } // namespace nc::coordinates
#define THROW_INVALID_ARGUMENT_ERROR(msg)
Definition: Error.hpp:37
Holds a right ascension object.
Definition: RA.hpp:45
void print() const
Definition: RA.hpp:155
std::string str() const
Definition: RA.hpp:144
uint8 hours() const noexcept
Definition: RA.hpp:114
uint8 minutes() const noexcept
Definition: RA.hpp:124
double radians() const noexcept
Definition: RA.hpp:94
friend std::ostream & operator<<(std::ostream &inStream, const RA &inRa)
Definition: RA.hpp:190
double degrees() const noexcept
Definition: RA.hpp:104
RA(double inDegrees)
Definition: RA.hpp:57
bool operator!=(const RA &inRhs) const noexcept
Definition: RA.hpp:179
bool operator==(const RA &inRhs) const noexcept
Definition: RA.hpp:167
double seconds() const noexcept
Definition: RA.hpp:134
Definition: Coordinate.hpp:45
std::string num2str(dtype inNumber)
Definition: num2str.hpp:44
bool essentiallyEqual(dtype inValue1, dtype inValue2) noexcept
Definition: essentiallyEqual.hpp:48
constexpr auto deg2rad(dtype inValue) noexcept
Definition: deg2rad.hpp:47
dtype floor(dtype inValue) noexcept
Definition: floor.hpp:48
std::uint8_t uint8
Definition: Types.hpp:42