20#ifndef INCLUDE_WYKOBI_MATH 21#define INCLUDE_WYKOBI_MATH 27#define WYKOBI_DOUBLE_PRECISION 29#ifdef WYKOBI_SINGLE_PRECISION 33#ifdef WYKOBI_DOUBLE_PRECISION 37#ifdef WYKOBI_EXTENDED_PRECISION 38typedef long double Float;
42static const Float Epsilon_High = 1.0E-16;
43static const Float Epsilon_Medium = 1.0E-10;
44static const Float Epsilon_Low = 1.0E-07;
45static const Float Epsilon = Epsilon_Medium;
46static const Float Infinity = std::numeric_limits<Float>::infinity();
49static const std::size_t RANDOM_RESOLUTION_INT = 1000000000;
50static const double RANDOM_RESOLUTION_FLT = RANDOM_RESOLUTION_INT * 1.0;
53static const Float PI =
Float(3.141592653589793238462643383279500);
54static const Float PI2 =
Float(6.283185307179586476925286766559000);
55static const Float PIDiv180 =
Float(0.017453292519943295769236907684886);
56static const Float _180DivPI =
Float(57.295779513082320876798154814105000);
59inline T
sqr(
const T& val);
61inline T
sqrt(
const T& val);
63inline T
abs(
const T& value);
65inline T
max(
const T& value1,
const T& value2);
67inline T
min(
const T& value1,
const T& value2);
69inline T
max(
const T& value1,
const T& value2,
const T& value3);
71inline T
min(
const T& value1,
const T& value2,
const T& value3);
76inline T
sin(
const T& value);
78inline T
cos(
const T& value);
80inline T
tan(
const T& value);
82inline T
asin(
const T& value);
84inline T
acos(
const T& value);
86inline T
atan(
const T& value);
95inline T
clamp(
const T& value,
const T& low,
const T& high);
98inline T
sqr(
const T& val) {
104 return std::sqrt(val);
108inline T
abs(
const T& value) {
109 return std::abs(value);
113inline T
max(
const T& value1,
const T& value2) {
114 return std::max<T>(value1, value2);
118inline T
min(
const T& value1,
const T& value2) {
119 return std::min<T>(value1, value2);
123inline T
max(
const T& value1,
const T& value2,
const T& value3) {
124 return max(value1,
max(value2, value3));
128inline T
min(
const T& value1,
const T& value2,
const T& value3) {
129 return min(value1,
min(value2, value3));
134 return std::numeric_limits<T>::infinity();
138inline T
sin(
const T& value) {
139 return std::sin(value);
143inline T
cos(
const T& value) {
144 return std::cos(value);
148inline T
tan(
const T& value) {
149 return std::tan(value);
154 return std::asin(value);
159 return std::acos(value);
164 return std::atan(value);
169 T final_sign = T(1.0);
171 if ((angle <= T(180.0)) && (angle > 90.0)) {
172 angle = T(180.0) - angle;
174 }
else if ((angle <= T(270.0)) && (angle > T(180.0))) {
175 angle = angle - T(180.0);
176 final_sign = T(-1.0);
177 }
else if ((angle <= T(360.0)) && (angle > T(270.0))) {
178 angle = T(360.0) - angle;
179 final_sign = T(-1.0);
182 angle *= T(PI / 180.0);
183 T asqr = angle * angle;
184 T result = T(-2.39e-08);
186 result += T(2.7526e-06);
188 result -= T(1.98409e-04);
190 result += T(8.3333315e-03);
192 result -= T(1.666666664e-01);
197 return result * final_sign;
202 T final_sign = T(1.0);
204 if ((angle <= T(180.0)) && (angle > 90.0)) {
205 angle = T(180.0) - angle;
206 final_sign = T(-1.0);
207 }
else if ((angle <= T(270.0)) && (angle > T(180.0))) {
208 angle = angle - T(180.0);
209 final_sign = T(-1.0);
210 }
else if ((angle <= T(360.0)) && (angle > T(270.0))) {
211 angle = T(360.0) - angle;
215 angle *= T(PI / 180.0);
216 T asqr = angle * angle;
217 T result = T(-2.605e-07);
219 result += T(2.47609e-05);
221 result -= T(1.3888397e-03);
223 result += T(4.16666418e-02);
225 result -= T(4.999999963e-01);
229 return result * final_sign;
234 T final_sign = T(1.0);
236 if ((angle <= T(180.0)) && (angle > 90.0)) {
237 angle = T(180.0) - angle;
238 final_sign = T(-1.0);
239 }
else if ((angle <= T(270.0)) && (angle > T(180.0))) {
240 angle = angle - T(180.0);
242 }
else if ((angle <= T(360.0)) && (angle > T(270.0))) {
243 angle = T(360.0) - angle;
244 final_sign = T(-1.0);
247 angle *= T(PI / 180.0);
248 T asqr = angle * angle;
249 T result = T(9.5168091e-03);
251 result += T(2.900525e-03);
253 result += T(2.45650893e-02);
255 result += T(5.33740603e-02);
257 result += T(1.333923995e-01);
259 result += T(3.333314036e-01);
264 return result * final_sign;
268inline T
clamp(
const T& value,
const T& low_end,
const T& high_end) {
269 if (value < low_end)
return low_end;
270 if (value > high_end)
return high_end;
T infinity()
Definition wykobi_math.hpp:133
T acos(const T &value)
Definition wykobi_math.hpp:158
T approx_tan(T angle)
Definition wykobi_math.hpp:233
T sin(const T &value)
Definition wykobi_math.hpp:138
T cos(const T &value)
Definition wykobi_math.hpp:143
T atan(const T &value)
Definition wykobi_math.hpp:163
T tan(const T &value)
Definition wykobi_math.hpp:148
double Float
Definition wykobi_math.hpp:34
T clamp(const T &value, const T &low, const T &high)
Definition wykobi_math.hpp:268
T asin(const T &value)
Definition wykobi_math.hpp:153
T max(const T &value1, const T &value2)
Definition wykobi_math.hpp:113
T sqrt(const T &val)
Definition wykobi_math.hpp:103
T sqr(const T &val)
Definition wykobi_math.hpp:98
T min(const T &value1, const T &value2)
Definition wykobi_math.hpp:118
T abs(const T &value)
Definition wykobi_math.hpp:108
T approx_sin(T angle)
Definition wykobi_math.hpp:168
T approx_cos(T angle)
Definition wykobi_math.hpp:201