00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GENLIB2_ANGLE_INCLUDED
00022 #define GENLIB2_ANGLE_INCLUDED
00023
00024 #include <iomanip>
00025 #include "uangle.h"
00026 #include "dmsconv.h"
00027
00028 namespace GenLib2
00029 {
00030
00035 class Angle : public UnitAngle
00036 {
00037
00038 public:
00040 Angle(bool dms=false) : UnitAngle(), _val(0), _is_dms(dms) {}
00041
00043 Angle(const string& s, bool dms=false) : UnitAngle(s), _val(0),
00044 _is_dms(dms) {}
00045
00047 void dec() { _is_dms = false; }
00048
00050 void dms() { _is_dms = true; }
00051
00053 bool is_dms() const { return _is_dms == true; }
00054
00056 void set(double v) { _val = ubase(v); }
00057
00059 double get() const { return conv(_val); }
00060
00062 void rad(double v) { _val = v; }
00063
00065 double rad() const { return _val; }
00066
00068 double deg() const { return _val * rho_deg ; }
00069
00071 double gon() const { return _val * rho_gon ; }
00072
00074 const char* unit() const { return _symbol.c_str(); }
00075
00076 private:
00078 double _val;
00079
00081 bool _is_dms;
00082 };
00083
00084
00085
00086
00088 inline istream& operator>>(istream& is, Angle& a)
00089 {
00090 double t = 0;
00091
00092 if (a.is_dms())
00093 {
00094 double h = 0, m = 0, s = 0;
00095 is >> h >> m >> s;
00096 t = dms2dec(h, m, s);
00097 }
00098 else
00099 is >> t;
00100
00101 a.set(t);
00102
00103 return is;
00104 }
00105
00106
00108 inline ostream& operator<<(ostream& os, const Angle& a)
00109 {
00110 if (a.is_dms())
00111 {
00112 double h = 0, m = 0, s = 0;
00113 dec2dms(a.get(), h, m, s);
00114 os.setf(ios::fixed, ios::floatfield);
00115 os << setw(4) << setprecision(0) << h << " ";
00116 os << setw(2) << m << " ";
00117 os << setw(8) << setprecision(5) << s;
00118 }
00119 else
00120 return os << a.get();
00121
00122 return os;
00123 }
00124
00125 }
00126
00127 #endif
00128