/***************************************************************************************** * * * OpenSpace * * * * Copyright (c) 2014-2017 * * * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * * software and associated documentation files (the "Software"), to deal in the Software * * without restriction, including without limitation the rights to use, copy, modify, * * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * * permit persons to whom the Software is furnished to do so, subject to the following * * conditions: * * * * The above copyright notice and this permission notice shall be included in all copies * * or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ #ifndef __OPENSPACE_MODULE_GLOBEBROWSING___ANGLE___H__ #define __OPENSPACE_MODULE_GLOBEBROWSING___ANGLE___H__ #include #include #include namespace openspace { namespace globebrowsing { template class Angle { public: static const T PI; static const T EPSILON; /** = 0 radians = 0 degrees = no revolution */ static const Angle ZERO; /** = PI/2 radians = 90 degrees = quarter of a revolution */ static const Angle QUARTER; /** = PI radians = 180 degrees = half a revolution */ static const Angle HALF; /** = 2PI radians = 360 degrees = a full revolution */ static const Angle FULL; static Angle fromRadians(T radians); static Angle fromDegrees(T degrees); static Angle fromRevolutions(T revs); public: /** Copy constructor */ Angle(const Angle& other); private: /** Private constructor. Use factory methods to avoid unit confusion */ Angle(T rad); public: inline T asRadians() const; inline T asDegrees() const; inline T asRevolutions() const; Angle operator+(const Angle& rhs) const; Angle operator-(const Angle& rhs) const; Angle operator*(T rhs) const; Angle operator/(T rhs) const; Angle operator-() const; void operator+=(const Angle& rhs); void operator-=(const Angle& rhs); void operator*=(T rhs); void operator/=(T rhs); bool operator<(const Angle& rhs) const; bool operator<=(const Angle& rhs) const; bool operator>(const Angle& rhs) const; bool operator>=(const Angle& rhs) const; bool operator==(const Angle& rhs) const; bool operator!=(const Angle& rhs) const; /** * Normalizes the angle to the interval [0, 2pi[ */ Angle& normalize(); /** * Normalizes the angle to the interval [center - pi, center + pi[ */ Angle& normalizeAround(const Angle& center); /** * Clamps the angle to the interval [min, max]. * Default arguments are [0, 2pi]. */ Angle& clamp(const Angle& min = ZERO, const Angle& max = FULL); Angle& abs(); /** * Returns a new angle normalized to the interval [0, 2pi[ */ Angle getNormalized() const; /** * Returns a new angle normalized to the interval [center - pi, center + pi[ */ Angle getNormalizedAround(const Angle& center) const; /** * Returns a new angle clamped to the interval [min, max]. * Default arguments are [0, 2pi]. */ Angle getClamped(const Angle& min = ZERO, const Angle& max = FULL) const; Angle getAbs() const; private: T _radians; }; using dAngle = Angle; using fAngle = Angle; } // namespace globebrowsing } // namespace openspace #include #endif // __OPENSPACE_MODULE_GLOBEBROWSING___ANGLE___H__