Home | History | Annotate | Download | only in detail
      1 ///////////////////////////////////////////////////////////////////////////////////
      2 /// OpenGL Mathematics (glm.g-truc.net)
      3 ///
      4 /// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
      5 /// Permission is hereby granted, free of charge, to any person obtaining a copy
      6 /// of this software and associated documentation files (the "Software"), to deal
      7 /// in the Software without restriction, including without limitation the rights
      8 /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      9 /// copies of the Software, and to permit persons to whom the Software is
     10 /// furnished to do so, subject to the following conditions:
     11 /// 
     12 /// The above copyright notice and this permission notice shall be included in
     13 /// all copies or substantial portions of the Software.
     14 /// 
     15 /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16 /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17 /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     18 /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19 /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     20 /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     21 /// THE SOFTWARE.
     22 ///
     23 /// @ref core
     24 /// @file glm/core/func_trigonometric.inl
     25 /// @date 2008-08-03 / 2011-06-15
     26 /// @author Christophe Riccio
     27 ///////////////////////////////////////////////////////////////////////////////////
     28 
     29 #include "_vectorize.hpp"
     30 #include <cmath>
     31 #include <limits>
     32 
     33 namespace glm
     34 {
     35 	// radians
     36 	template <typename genType>
     37 	GLM_FUNC_QUALIFIER genType radians
     38 	(
     39 		genType const & degrees
     40 	)
     41 	{
     42 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'radians' only accept floating-point input");
     43 
     44 		return degrees * genType(0.01745329251994329576923690768489);
     45 	}
     46 
     47 	VECTORIZE_VEC(radians)
     48 	
     49 	// degrees
     50 	template <typename genType>
     51 	GLM_FUNC_QUALIFIER genType degrees
     52 	(
     53 		genType const & radians
     54 	)
     55 	{
     56 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'degrees' only accept floating-point input");
     57 
     58 		return radians * genType(57.295779513082320876798154814105);
     59 	}
     60 
     61 	VECTORIZE_VEC(degrees)
     62 
     63 	// sin
     64 	template <typename genType>
     65 	GLM_FUNC_QUALIFIER genType sin
     66 	(
     67 		genType const & angle
     68 	)
     69 	{
     70 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'sin' only accept floating-point input");
     71 
     72 		return genType(::std::sin(angle));
     73 	}
     74 
     75 	VECTORIZE_VEC(sin)
     76 
     77 	// cos
     78 	template <typename genType>
     79 	GLM_FUNC_QUALIFIER genType cos(genType const & angle)
     80 	{
     81 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'cos' only accept floating-point input");
     82 
     83 		return genType(::std::cos(angle));
     84 	}
     85 
     86 	VECTORIZE_VEC(cos)
     87 
     88 	// tan
     89 	template <typename genType>
     90 	GLM_FUNC_QUALIFIER genType tan
     91 	(
     92 		genType const & angle
     93 	)
     94 	{
     95 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'tan' only accept floating-point input");
     96 
     97 		return genType(::std::tan(angle));
     98 	}
     99 
    100 	VECTORIZE_VEC(tan)
    101 
    102 	// asin
    103 	template <typename genType>
    104 	GLM_FUNC_QUALIFIER genType asin
    105 	(
    106 		genType const & x
    107 	)
    108 	{
    109 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'asin' only accept floating-point input");
    110 
    111 		return genType(::std::asin(x));
    112 	}
    113 
    114 	VECTORIZE_VEC(asin)
    115 
    116 	// acos
    117 	template <typename genType>
    118 	GLM_FUNC_QUALIFIER genType acos
    119 	(
    120 		genType const & x
    121 	)
    122 	{
    123 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acos' only accept floating-point input");
    124 
    125 		return genType(::std::acos(x));
    126 	}
    127 
    128 	VECTORIZE_VEC(acos)
    129 
    130 	// atan
    131 	template <typename genType>
    132 	GLM_FUNC_QUALIFIER genType atan
    133 	(
    134 		genType const & y, 
    135 		genType const & x
    136 	)
    137 	{
    138 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atan' only accept floating-point input");
    139 
    140 		return genType(::std::atan2(y, x));
    141 	}
    142 
    143 	VECTORIZE_VEC_VEC(atan)
    144 
    145 	template <typename genType>
    146 	GLM_FUNC_QUALIFIER genType atan
    147 	(
    148 		genType const & x
    149 	)
    150 	{
    151 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atan' only accept floating-point input");
    152 
    153 		return genType(::std::atan(x));
    154 	}
    155 
    156 	VECTORIZE_VEC(atan)
    157 
    158 	// sinh
    159 	template <typename genType> 
    160 	GLM_FUNC_QUALIFIER genType sinh
    161 	(
    162 		genType const & angle
    163 	)
    164 	{
    165 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'sinh' only accept floating-point input");
    166 
    167 		return genType(std::sinh(angle));
    168 	}
    169 
    170 	VECTORIZE_VEC(sinh)
    171 
    172 	// cosh
    173 	template <typename genType> 
    174 	GLM_FUNC_QUALIFIER genType cosh
    175 	(
    176 		genType const & angle
    177 	)
    178 	{
    179 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'cosh' only accept floating-point input");
    180 
    181 		return genType(std::cosh(angle));
    182 	}
    183 
    184 	VECTORIZE_VEC(cosh)
    185 
    186 	// tanh
    187 	template <typename genType>
    188 	GLM_FUNC_QUALIFIER genType tanh
    189 	(
    190 		genType const & angle
    191 	)
    192 	{
    193 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'tanh' only accept floating-point input");
    194 
    195 		return genType(std::tanh(angle));
    196 	}
    197 
    198 	VECTORIZE_VEC(tanh)
    199 
    200 	// asinh
    201 	template <typename genType> 
    202 	GLM_FUNC_QUALIFIER genType asinh
    203 	(
    204 		genType const & x
    205 	)
    206 	{
    207 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'asinh' only accept floating-point input");
    208 		
    209 		return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x));
    210 	}
    211 
    212 	VECTORIZE_VEC(asinh)
    213 
    214 	// acosh
    215 	template <typename genType> 
    216 	GLM_FUNC_QUALIFIER genType acosh
    217 	(
    218 		genType const & x
    219 	)
    220 	{
    221 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acosh' only accept floating-point input");
    222 
    223 		if(x < genType(1))
    224 			return genType(0);
    225 		return log(x + sqrt(x * x - genType(1)));
    226 	}
    227 
    228 	VECTORIZE_VEC(acosh)
    229 
    230 	// atanh
    231 	template <typename genType>
    232 	GLM_FUNC_QUALIFIER genType atanh
    233 	(
    234 		genType const & x
    235 	)
    236 	{
    237 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atanh' only accept floating-point input");
    238 		
    239 		if(abs(x) >= genType(1))
    240 			return 0;
    241 		return genType(0.5) * log((genType(1) + x) / (genType(1) - x));
    242 	}
    243 
    244 	VECTORIZE_VEC(atanh)
    245 
    246 }//namespace glm
    247