Ilwis-Objects  1.0
GIS and Remote Sensing framework for data access and processing
 All Classes Functions Enumerations Pages
angle.h
1 #ifndef ANGLE_H
2 #define ANGLE_H
3 
4 
5 #include <sstream>
6 #include <iomanip>
7 #include "ilwis.h"
8 
9 namespace Ilwis {
10 class Angle {
11 public:
12  enum Unit{uRADIANS, uDEGREES};
13 
14  Angle() : _degrees(rUNDEF){}
15  Angle(double angle, bool isRadian=false) {
16  if ( isRadian)
17  _degrees = angle * M_RAD_BASE;
18  else
19  _degrees = angle ;
20  }
21  bool isValid() const {
22  return _degrees >= 0;
23  }
24 
25  double degrees() const {
26  return _degrees ;
27  }
28 
29  double radians() const {
30  return _degrees / M_RAD_BASE;
31  }
32  operator double() const {
33  return _degrees;
34  }
35 
36  QString toString(bool asRadians) {
37  std::stringstream txt;
38  if ( asRadians) {
39  txt << std::fixed << std::setprecision(8) << _degrees / M_RAD_BASE;
40  return QString(txt.str().c_str());
41  }
42  int dgr = (int)_degrees;
43  int minutes = (_degrees - dgr) * 60;
44  double sec = (( _degrees - dgr) - minutes/60.0) * 3600.0;
45  txt << dgr << " " << minutes <<"' " << std::fixed << std::setprecision(3) << sec;
46  return QString(txt.str().c_str());
47 
48  }
49 
50  Angle& operator+=(const Angle& a) {
51  _degrees += a.degrees();
52  _degrees = fmod(_degrees ,360.0);
53  return *this;
54  }
55 
56  Angle& operator*=(double f) {
57  _degrees *= f;
58  _degrees = fmod(_degrees ,360.0);
59  _degrees = _degrees > 0 ? _degrees : 360.0 - _degrees;
60  return *this;
61  }
62 
63  Angle& operator/=(double f) {
64  if ( f == 0)
65  return *this;
66  _degrees /= f;
67  _degrees = fmod(_degrees ,360.0);
68  _degrees = _degrees > 0 ? _degrees : 360.0 - _degrees;
69  return *this;
70  }
71 
72  Angle& operator-=(const Angle& a) {
73  _degrees -= a.degrees();
74  _degrees = fmod(_degrees ,360.0);
75  _degrees = _degrees > 0 ? _degrees : 360.0 - _degrees;
76  return *this;
77  }
78 
79 protected:
80  double _degrees;
81 
82 
83 };
84 
85 //class Radians : public Angle{
86 //public:
87 // Radians() : Angle() {}
88 // Radians(double v, bool isDegrees=false) : Angle(v, !isDegrees ) {}
89 // Radians(const Angle& r) { _degrees = r.radians(); _behaveAsRadians = true;}
90 // Radians& operator=(const Angle& r) {
91 // _degrees = r.radians();
92 // _behaveAsRadians = true;
93 // return *this;
94 // }
95 //private:
96 // virtual void asRadians(bool ) {}
97 //};
98 
99 //class Degrees : public Angle{
100 //public:
101 // Degrees() : Angle() {}
102 // Degrees(double v, bool isDegrees=true) : Angle(v, !isDegrees) {}
103 // Degrees(const Angle& r) { _degrees = r.radians(); _behaveAsRadians = false;}
104 // Degrees& operator=(const Angle& r) {
105 // _degrees = r.radians();
106 // _behaveAsRadians = false;
107 // return *this;
108 // }
109 //private:
110 // virtual void asRadians(bool ) {}
111 //};
112 }
113 
114 
115 
116 
117 #endif // ANGLE_H