00001 #ifndef Angle_H 00002 #define Angle_H 00003 00024 #include <iostream> 00025 #include <cmath> 00026 00027 00029 00036 00037 00045 class Angle { 00047 friend std::istream &operator>>(std::istream &in, Angle &angle) { 00048 in >> angle.m_value; angle.clip(); return in;} 00049 00050 public: 00052 Angle() :m_value(0.0) {} 00054 00055 Angle(const double value) :m_value(value) {clip();} 00057 00058 Angle(const Angle &angle) :m_value(angle.m_value) {} 00060 ~Angle() {} 00061 00063 00064 00065 00066 Angle &operator=(const Angle &angle) { 00067 m_value = angle.m_value; return *this;} 00069 00070 Angle &operator=(const double value) { 00071 m_value = value; clip(); return *this;} 00072 00074 00075 Angle &operator+=(const double value) { 00076 m_value += value; clip(); return *this;} 00078 00079 Angle &operator-=(const double value) { 00080 m_value -= value; clip(); return *this;} 00082 00083 Angle &operator*=(const double value) { 00084 m_value *= value; clip(); return *this;} 00086 00087 Angle &operator/=(const double value) { 00088 m_value /= value; clip(); return *this;} 00090 00091 00093 00094 00095 00096 operator double() const {return m_value;} 00098 00099 double degrees() const {return (m_value / M_PI) * 180.0;} 00101 00102 private: 00103 double m_value; 00104 00105 void clip() { 00106 while (m_value < 0.0) m_value += 2.0 * M_PI; 00107 while (m_value >= (2.0 * M_PI)) m_value -= 2.0 * M_PI;} 00108 }; 00109 00110 00111 #endif