//%TITLE Angle class implementation--copyright 2001 Information Disciplines, Inc. // (See Angle.hpp for detailed explanations) #include "global.hpp" #include "Angle.hpp" short Angle::minutes() const {long result = long (abs(toDegrees()) * 60.0) % 60; return value >= 0 ? result : -result; } short Angle::seconds() const {long result = long(abs(toDegrees()) * 3600.0 + 0.5) % 60; return value >= 0 ? result : -result; } Angle Angle::operator- () const {return Angle(-value);} Angle& Angle::operator+=(ANGLE rs) {value+=rs.value; normalize(); return *this;} Angle& Angle::operator-=(ANGLE rs) {value-=rs.value; normalize(); return *this;} Angle& Angle::operator*=(DOUBLE rs) {value*=rs; normalize(); return *this;} Angle& Angle::operator/=(DOUBLE rs) {value/=rs; normalize(); return *this;} double Angle::operator/ (ANGLE rs) const {return value / rs.value;} void Angle::normalize() {static DOUBLE twoPi = PI + PI; while (value <= -PI) value += twoPi; while (value > PI) value -= twoPi; } Angle::Angle(INT deg, INT min, INT sec) {double seconds = sec + 60 * (min + 60 * abs(deg)); value = (seconds * PI / 648000.0); normalize(); } ostream& operator<< (ostream& ls, ANGLE rs) {CHAR degreeSymbol = '\370'; return ls << (rs.toRadians() < 0 ? "-" : "") << abs(rs.degrees()) << degreeSymbol << abs(rs.minutes()) << '\'' << abs(rs.seconds()) << '\"';}