/////////////////////////////////////////////////////////////////////////////////////////////////// // OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2005-12-30 // Updated : 2008-09-29 // Licence : This source is under MIT License // File : glm/gtx/vector_angle.inl /////////////////////////////////////////////////////////////////////////////////////////////////// namespace glm { template <typename genType> GLM_FUNC_QUALIFIER genType angle ( genType const & x, genType const & y ) { GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'angle' only accept floating-point inputs"); genType const Angle(acos(clamp(dot(x, y), genType(-1), genType(1)))); #ifdef GLM_FORCE_RADIANS return Angle; #else # pragma message("GLM: angle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") return degrees(Angle); #endif } template <typename T, precision P, template <typename, precision> class vecType> GLM_FUNC_QUALIFIER T angle ( vecType<T, P> const & x, vecType<T, P> const & y ) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'angle' only accept floating-point inputs"); T const Angle(acos(clamp(dot(x, y), T(-1), T(1)))); #ifdef GLM_FORCE_RADIANS return Angle; #else # pragma message("GLM: angle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") return degrees(Angle); #endif } //! \todo epsilon is hard coded to 0.01 template <typename T, precision P> GLM_FUNC_QUALIFIER T orientedAngle ( detail::tvec2<T, P> const & x, detail::tvec2<T, P> const & y ) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'orientedAngle' only accept floating-point inputs"); T const Dot = clamp(dot(x, y), T(-1), T(1)); #ifdef GLM_FORCE_RADIANS T const Angle(acos(Dot)); #else # pragma message("GLM: orientedAngle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") T const Angle(degrees(acos(Dot))); #endif detail::tvec2<T, P> const TransformedVector(glm::rotate(x, Angle)); if(all(epsilonEqual(y, TransformedVector, T(0.01)))) return Angle; else return -Angle; } template <typename T, precision P> GLM_FUNC_QUALIFIER T orientedAngle ( detail::tvec3<T, P> const & x, detail::tvec3<T, P> const & y, detail::tvec3<T, P> const & ref ) { GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'orientedAngle' only accept floating-point inputs"); T const Dot = clamp(dot(x, y), T(-1), T(1)); #ifdef GLM_FORCE_RADIANS T const Angle(acos(Dot)); #else # pragma message("GLM: orientedAngle function returning degrees is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") T const Angle(degrees(acos(Dot))); #endif if(dot(ref, cross(x, y)) < T(0)) return -Angle; else return Angle; } }//namespace glm