1 /* |
|
2 * LDForge: LDraw parts authoring CAD |
|
3 * Copyright (C) 2013 - 2020 Teemu Piippo |
|
4 * |
|
5 * This program is free software: you can redistribute it and/or modify |
|
6 * it under the terms of the GNU General Public License as published by |
|
7 * the Free Software Foundation, either version 3 of the License, or |
|
8 * (at your option) any later version. |
|
9 * |
|
10 * This program is distributed in the hope that it will be useful, |
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
13 * GNU General Public License for more details. |
|
14 * |
|
15 * You should have received a copy of the GNU General Public License |
|
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
17 */ |
|
18 |
|
19 #pragma once |
|
20 #include <cmath> |
|
21 #include "utility.h" |
|
22 |
|
23 namespace math |
|
24 { |
|
25 using std::abs; |
|
26 using std::sqrt; |
|
27 using std::sin; |
|
28 using std::cos; |
|
29 using std::tan; |
|
30 using std::atan; |
|
31 using std::atan2; |
|
32 using std::acos; |
|
33 using std::asin; |
|
34 using std::exp; |
|
35 using std::log; |
|
36 using std::log10; |
|
37 using std::hypot; |
|
38 using std::floor; |
|
39 using std::ceil; |
|
40 using std::trunc; |
|
41 using std::round; |
|
42 template<typename T, typename... Rest> |
|
43 inline auto hypot(T&& x, Rest&&... rest) |
|
44 { |
|
45 return math::hypot(x, math::hypot(rest...)); |
|
46 } |
|
47 template<typename T, typename... Rest> |
|
48 const T& max(const T& x, const T& y) |
|
49 { |
|
50 if (x > y) |
|
51 return x; |
|
52 else |
|
53 return y; |
|
54 } |
|
55 template<typename T, typename... Rest> |
|
56 const T& max(const T& x, const T& y, Rest&&... rest) |
|
57 { |
|
58 return math::max(x, math::max(y, rest...)); |
|
59 } |
|
60 template<typename T, typename... Rest> |
|
61 const T& min(const T& x, const T& y) |
|
62 { |
|
63 if (x < y) |
|
64 return x; |
|
65 else |
|
66 return y; |
|
67 } |
|
68 template<typename T, typename... Rest> |
|
69 const T& min(const T& x, const T& y, Rest&&... rest) |
|
70 { |
|
71 return math::min(x, math::min(y, rest...)); |
|
72 } |
|
73 constexpr double infinity = std::numeric_limits<double>::infinity(); |
|
74 constexpr long double pi = M_PIl; |
|
75 // Returns the minimum value of a container |
|
76 template<typename T> |
|
77 inline auto nmin(T&& values) |
|
78 { |
|
79 auto it = std::begin(values); |
|
80 auto result_p = it; |
|
81 for (++it; it != std::end(values); ++it) |
|
82 { |
|
83 if (*it < *result_p) |
|
84 result_p = it; |
|
85 } |
|
86 return *result_p; |
|
87 } |
|
88 // Returns the maximum value of a container |
|
89 template<typename T> |
|
90 inline auto nmax(T&& values) |
|
91 { |
|
92 auto it = std::begin(values); |
|
93 auto result_p = it; |
|
94 for (++it; it != std::end(values); ++it) |
|
95 { |
|
96 if (*it > *result_p) |
|
97 result_p = it; |
|
98 } |
|
99 return *result_p; |
|
100 } |
|
101 /* |
|
102 * Returns the empty sum. (recursion base) |
|
103 */ |
|
104 template<typename T> |
|
105 constexpr T sum() |
|
106 { |
|
107 return {}; |
|
108 } |
|
109 |
|
110 /* |
|
111 * Returns the sum of n arguments. |
|
112 */ |
|
113 template<typename T, typename... Rest> |
|
114 constexpr auto sum(const T& arg, Rest&&... rest) |
|
115 { |
|
116 return arg + sum<T>(rest...); |
|
117 } |
|
118 |
|
119 std::optional<glm::vec3> linePlaneIntersection(); |
|
120 } |
|
121 |
|
122 template<typename T, glm::qualifier Q> |
|
123 inline unsigned int qHash(const glm::vec<3, T, Q>& key) |
|
124 { |
|
125 return qHash(key.x) ^ utility::rotl10(qHash(key.y)) ^ utility::rotl20(qHash(key.z)); |
|
126 } |
|