NumCpp  1.0
A C++ implementation of the Python Numpy library
RA.hpp
Go to the documentation of this file.
1 #pragma once
30 
31 #include "NumCpp/Core/Types.hpp"
35 #include "NumCpp/Utils/num2str.hpp"
36 
37 #include <cmath>
38 #include <iostream>
39 #include <string>
40 
41 namespace nc
42 {
43  namespace coordinates
44  {
45  //================================================================================
47  class RA
48  {
49  public:
50  //============================================================================
53  RA() = default;
54 
55  //============================================================================
60  RA(double inDegrees) :
61  degrees_(inDegrees),
62  radians_(deg2rad(inDegrees))
63  {
64  if (inDegrees < 0 || inDegrees >= 360)
65  {
66  THROW_INVALID_ARGUMENT_ERROR("input degrees must be of the range [0, 360)");
67  }
68 
69  hours_ = static_cast<uint8>(std::floor(degrees_ / 15.0));
70  const double decMinutes = (degrees_ - static_cast<double>(hours_) * 15.0) * 4.0;
71  minutes_ = static_cast<uint8>(std::floor(decMinutes));
72  seconds_ = static_cast<double>((decMinutes - static_cast<double>(minutes_)) * 60.0);
73  }
74 
75  //============================================================================
82  RA(uint8 inHours, uint8 inMinutes, double inSeconds) noexcept :
83  hours_(inHours),
84  minutes_(inMinutes),
85  seconds_(inSeconds)
86  {
87  degrees_ = static_cast<double>(hours_) * 15.0 + static_cast<double>(minutes_) / 4.0 + seconds_ / 240.0;
88  radians_ = deg2rad(degrees_);
89  }
90 
91  //============================================================================
96  double radians() const noexcept
97  {
98  return radians_;
99  }
100 
101  //============================================================================
106  double degrees() const noexcept
107  {
108  return degrees_;
109  }
110 
111  //============================================================================
116  uint8 hours() const noexcept
117  {
118  return hours_;
119  }
120 
121  //============================================================================
126  uint8 minutes() const noexcept
127  {
128  return minutes_;
129  }
130 
131  //============================================================================
136  double seconds() const noexcept
137  {
138  return seconds_;
139  }
140 
141  //============================================================================
146  std::string str() const
147  {
148  std::string out = "RA hms: " + utils::num2str(hours_) + " hours, " + utils::num2str(minutes_) + " minutes, ";
149  out += utils::num2str(seconds_) + " seconds\nRA degrees: " + utils::num2str(degrees_) + "\n";
150  return out;
151  }
152 
153  //============================================================================
156  void print() const
157  {
158  std::cout << *this;
159  }
160 
161  //============================================================================
168  bool operator==(const RA& inRhs) const noexcept
169  {
170  return utils::essentiallyEqual(degrees_, inRhs.degrees_);
171  }
172 
173  //============================================================================
180  bool operator!=(const RA& inRhs) const noexcept
181  {
182  return !(*this == inRhs);
183  }
184 
185  //============================================================================
191  friend std::ostream& operator<<(std::ostream& inStream, const RA& inRa)
192  {
193  inStream << inRa.str();
194  return inStream;
195  }
196 
197  private:
198  //====================================Attributes==============================
199  uint8 hours_{ 0 };
200  uint8 minutes_{ 0 };
201  double seconds_{ 0.0 };
202  double degrees_{ 0.0 };
203  double radians_{ 0.0 };
204  };
205  }
206 }
deg2rad.hpp
Error.hpp
nc::coordinates::RA
Holds a right ascension object.
Definition: RA.hpp:47
nc::utils::essentiallyEqual
bool essentiallyEqual(dtype inValue1, dtype inValue2) noexcept
Definition: essentiallyEqual.hpp:53
nc::uint8
std::uint8_t uint8
Definition: Types.hpp:43
nc::utils::num2str
std::string num2str(dtype inNumber)
Definition: num2str.hpp:47
nc::coordinates::RA::RA
RA(uint8 inHours, uint8 inMinutes, double inSeconds) noexcept
Definition: RA.hpp:82
nc::deg2rad
constexpr auto deg2rad(dtype inValue) noexcept
Definition: deg2rad.hpp:50
nc::floor
dtype floor(dtype inValue) noexcept
Definition: floor.hpp:49
nc::coordinates::RA::operator<<
friend std::ostream & operator<<(std::ostream &inStream, const RA &inRa)
Definition: RA.hpp:191
num2str.hpp
nc::coordinates::RA::operator!=
bool operator!=(const RA &inRhs) const noexcept
Definition: RA.hpp:180
nc::coordinates::RA::print
void print() const
Definition: RA.hpp:156
nc::coordinates::RA::RA
RA()=default
nc
Definition: Coordinate.hpp:45
nc::coordinates::RA::str
std::string str() const
Definition: RA.hpp:146
nc::coordinates::RA::seconds
double seconds() const noexcept
Definition: RA.hpp:136
nc::coordinates::RA::RA
RA(double inDegrees)
Definition: RA.hpp:60
essentiallyEqual.hpp
nc::coordinates::RA::hours
uint8 hours() const noexcept
Definition: RA.hpp:116
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::RA::radians
double radians() const noexcept
Definition: RA.hpp:96
nc::coordinates::RA::minutes
uint8 minutes() const noexcept
Definition: RA.hpp:126
Types.hpp
nc::coordinates::RA::operator==
bool operator==(const RA &inRhs) const noexcept
Definition: RA.hpp:168