CARMA C++
Angle.h
1 #ifndef SZA_UTIL_ANGLE_H
2 #define SZA_UTIL_ANGLE_H
3 
11 #include <cmath>
12 #include <string>
13 #include <iostream>
14 
15 #include "carma/szautil/ConformableQuantity.h"
16 
17 namespace sza {
18  namespace util {
19 
20  class Angle : public ConformableQuantity {
21  public:
22 
23  class Radians {};
24  class Degrees {};
25  class ArcSec {};
26  class ArcMinutes {};
27  class MilliArcSec {};
28 
32  Angle(bool modulo=false);
33 
37  Angle(std::string degrees, bool modulo);
38 
42  Angle(const Radians& units, double radians, bool modulo=false);
43  Angle(const Degrees& units, double degrees, bool modulo=false);
44  Angle(const MilliArcSec& units, double mas, bool modulo=false);
45  Angle(const ArcSec& units, double as, bool modulo=false);
46  Angle(const ArcMinutes& units, double am, bool modulo=false);
47  Angle(const Angle& angle);
48  Angle(Angle& angle);
49 
53  virtual ~Angle();
54 
58  void setRadians(double radians);
59  void setDegrees(double degrees);
60  void setDegrees(double degrees, double arcmin, double arcsec);
61  void setArcMinutes(double am);
62  void setMas(double mas);
63  void setArcSec(double as);
64  void setDegrees(std::string degrees);
65 
69  virtual void addRadians(double radians);
70  virtual void addDegrees(double degrees);
71  virtual void addDegrees(std::string degrees);
72 
76  inline double radians() {
77  return radians_;
78  }
79 
80  inline double degrees() {
81  return radians_ * degPerRad_;
82  }
83 
84  inline double arcsec() {
85  return radians_ * arcSecPerRad_;
86  }
87 
88  inline double arcmin() {
89  return radians_ * arcMinPerRad_;
90  }
91 
92  inline double mas() {
93  return radians_ * masPerRad_;
94  }
95 
96  inline short tiltmeterUnits() {
97  return (short)(arcmin() * 1000);
98  }
99 
100  inline short caltertUnits() {
101  return (short)(degrees() * 100);
102  }
103 
104  std::string strDegrees();
105 
106  void operator=(Angle& angle);
107  void operator=(const Angle& angle);
108 
112  friend std::ostream& operator<<(std::ostream& os, Angle& angle);
113 
117  Angle operator+(Angle& angle);
118 
122  void operator+=(Angle& angle);
123  void operator+=(const Angle& angle);
124 
128  Angle operator-(Angle& angle);
129 
133  void operator/=(unsigned uval);
134 
138  Angle operator/(unsigned uval);
139 
143  bool operator>(Angle& angle);
144  bool operator>(const Angle& angle);
145  bool operator>=(Angle& angle);
146  bool operator<(Angle& angle);
147  bool operator<(const Angle& angle);
148  bool operator<=(Angle& angle);
149 
150  //------------------------------------------------------------
151  // Public utility methods
152 
156  static double sexagesimalToDouble(std::string valStr);
157 
161  static std::string doubleToSexagesimal(double val);
162 
163  static double radiansToPiMinusPi(double radians);
164  static double radiansToZeroTwoPi(double radians);
165 
166  static const double pi_;
167  static const double twoPi_;
168 
169  static const double degPerRad_;
170  static const double arcSecPerDegree_;
171  static const double masPerDegree_;
172  static const double arcSecPerRad_;
173  static const double arcMinPerRad_;
174  static const double masPerRad_;
175 
176  void initialize();
177 
178  protected:
179 
180  Angle(double radians, bool modulo);
181 
182  double radians_; // The radian representation of this angle
183  bool modulo_; // True if this angle should be manipulated
184  // modulo twoPi_
185 
186  }; // End class Angle
187 
188  } // End namespace util
189 } // End namespace sza
190 
191 
192 
193 #endif // End #ifndef SZA_UTIL_ANGLE_H