Line data Source code
1 : #pragma once
2 : #include <cmath>
3 : #include <limits>
4 : #include <cassert>
5 : #include <iostream>
6 :
7 : #ifdef PI
8 : # undef PI
9 : #endif
10 :
11 : namespace m3d
12 : {
13 : using scalar = double;
14 : constexpr scalar PI = 3.14159265358979323846;
15 : constexpr scalar EPSILON = 1e-9; // std::numeric_limits<scalar>::epsilon();
16 : constexpr scalar ERROR_ULP = 2.107342e-08; // unit of least precision (or Unit in the last place) for doubles
17 :
18 : template <typename T>
19 26898 : inline T clamp(T v, T lo, T hi)
20 : {
21 26898 : return (v < lo) ? lo : ((v > hi) ? hi : v);
22 : }
23 :
24 : inline scalar to_radians(scalar degrees)
25 : {
26 : return degrees * (PI / 180.0);
27 : }
28 :
29 7317 : inline scalar min(scalar x, scalar y)
30 : {
31 7317 : return std::min(x, y);
32 : }
33 :
34 0 : inline scalar max(scalar x, scalar y)
35 : {
36 0 : return std::max(x, y);
37 : }
38 :
39 27895 : inline scalar abs(scalar x)
40 : {
41 27895 : return std::abs(x);
42 : }
43 :
44 22512 : inline scalar sqrt(scalar x)
45 : {
46 22512 : return std::sqrt(x);
47 : }
48 :
49 62 : inline scalar sin(scalar x)
50 : {
51 62 : return std::sin(x);
52 : }
53 :
54 64 : inline scalar cos(scalar x)
55 : {
56 64 : return std::cos(x);
57 : }
58 :
59 10 : inline scalar atan2(scalar y, scalar x)
60 : {
61 10 : return std::atan2(y, x);
62 : }
63 : }
|