ActiveLib
Loading...
Searching...
No Matches
MathFunctions.h
1
6#ifndef ACTIVE_MATH_FUNCTIONS
7#define ACTIVE_MATH_FUNCTIONS
8
9#include <cmath>
10#include <numbers>
11
16namespace active::math {
17
18 //MARK: - Common maths constants
19
20 constexpr double pi = std::numbers::pi_v<double>;
22 constexpr double eps = 1e-5;
24 constexpr double epsAngle = pi / 1800;
25
26 //MARK: - Common unit conversions
27
29 constexpr double radianToDegree = 180.0 / pi;
30 constexpr double degreeToRadian = 1.0 / radianToDegree;
31 constexpr double radianToMinute = radianToDegree * 60;
32 constexpr double minuteToRadian = 1.0 / radianToMinute;
33 constexpr double radianToSecond = radianToMinute * 60;
34 constexpr double secondToRadian = 1.0 / radianToSecond;
35 constexpr double radianToGrad = radianToDegree * 10.0 / 9.0;
36 constexpr double gradToRadian = 1.0 / radianToGrad;
37
39 constexpr double inchToMillimetre = 25.4;
40 constexpr double pointToMillimetre = 0.3527777777778;
41 constexpr double footToInch = 12;
42 constexpr double yardToFoot = 3;
43 constexpr double metreToKilometre = 1000;
44 constexpr double metreToDecimetre = 10;
45 constexpr double metreToCentimetre = 1e2;
46 constexpr double metreToMillimetre = 1e3;
47 constexpr double metreToInch = metreToMillimetre / inchToMillimetre;
48 constexpr double metreToFoot = metreToInch / footToInch;
49 constexpr double metreToYard = metreToFoot / yardToFoot;
50 constexpr double metreToMile = 0.0006213712;
51
53 constexpr double metre2ToMillimetre2 = metreToMillimetre * metreToMillimetre;
54 constexpr double metre2ToCentimetre2 = metreToCentimetre * metreToCentimetre;
55 constexpr double metre2ToAre = 0.01;
56 constexpr double metre2ToHectare = 0.0001;
57 constexpr double metre2ToInch2 = metreToInch * metreToInch;
58 constexpr double metre2ToFoot2 = metreToFoot * metreToFoot;
59 constexpr double metre2ToYard2 = metreToYard * metreToYard;
60 constexpr double metre2ToMile2 = metreToMile * metreToMile;
61
63 constexpr double metre3ToLitre = 1000.0;
64 constexpr double metre3ToCentimetre3 = metre2ToCentimetre2 * metreToMillimetre;
65 constexpr double metre3ToMillimetre3 = metre2ToMillimetre2 * metreToCentimetre;
66 constexpr double metre3ToInch3 = metre2ToInch2 * metreToInch;
67 constexpr double metre3ToFoot3 = metre2ToFoot2 * metreToFoot;
68 constexpr double metre3ToYard3 = metre2ToYard2 * metreToYard;
69 constexpr double metre3ToGallon = 264.172051;
70
72 constexpr double kilogramToMilligram = 1000000.0;
73 constexpr double kilogramToGram = 1000.0;
74 constexpr double kilogramToTonne = 0.001;
75 constexpr double kilogramToOunce = 35.2739619;
76 constexpr double kilogramToPound = 2.204622622;
77 constexpr double kilogramToStone = 0.15747304;
78 constexpr double kilogramToTon = 0.001102311;
79
80 //MARK: - Common floating point comparisons
81
89 inline bool isLess(double val1, double val2, double prec = eps)
90 { return (val2 - val1 > prec); }
91
99 inline bool isEqual(double val1, double val2, double prec = eps)
100 { return (fabs(val1 - val2) <= prec); }
108 inline bool isGreater(double val1, double val2, double prec = eps)
109 { return (val1 - val2 > prec); }
117 inline int compare(double val1, double val2, double prec = eps)
118 { return isEqual(val1, val2, prec) ? 0 : (isLess(val1, val2, prec) ? -1 : 1); }
119
120 inline bool isLessOrEqual(double val1, double val2, double prec = eps)
121 { return (isEqual(val1, val2, prec) || isLess(val1, val2, prec)); }
122
123 inline bool isGreaterOrEqual(double val1, double val2, double prec = eps)
124 { return (isEqual(val1, val2, prec) || isGreater(val1, val2, prec)); }
125
126 inline bool isLessZero(double val, double prec = eps)
127 { return isLess(val, 0.0, prec); }
128
129 inline bool isLessOrEqualZero(double val, double prec = eps)
130 { return isLessOrEqual(val, 0.0, prec); }
131
132 inline bool isZero(double val, double prec = eps)
133 { return isEqual(val, 0.0, prec); }
134
135 inline bool isGreaterOrEqualZero(double val, double prec = eps)
136 { return isGreaterOrEqual(val, 0.0, prec); }
137
138 inline bool isGreaterZero(double val, double prec = eps)
139 { return isGreater(val, 0.0, prec); }
140
141 inline bool isBetween(double val, double lower, double upper, double prec = eps)
142 { return (isGreater(val, lower, prec) && isLess(val, upper, prec)); }
143
144 inline bool isWithin(double val, double lower, double upper, double prec = eps)
145 { return (isGreaterOrEqual(val, lower, prec) && isLessOrEqual(val, upper, prec)); }
146
147 inline double fMod(double val1, double val2, double prec = eps) {
148 val1 = fmod(val1, val2);
149 return (isZero(val1, prec) || isEqual(fabs(val1), fabs(val2), prec)) ? 0.0 : val1;
150 }
151
152 //MARK: - Common math functions
153
154 template <class T>
155 inline const T& minVal(const T& val1, const T& val2) { return (val1 < val2) ? val1 : val2; }
156 template <class T>
157 inline const T& maxVal(const T& val1, const T& val2) { return (val1 > val2) ? val1 : val2; }
158
160 inline double round(const double& val, double module = eps)
161 { return floor((val / module) + 0.5) * module; }
162
163 inline double roundUp(const double& val, double module = eps, double tolerance = eps) {
164 //If tolerances differ from the module size and the current value is within the tolerances of a module, we accept that module size
165 if (module > tolerance) {
166 double rounded = round(val, module);
167 if (isEqual(val, rounded, tolerance))
168 return rounded;
169 }
170 return ceil(val / module) * module;
171 } //roundUp
172
173 inline double roundDown(const double& val, double module = eps, double tolerance = eps) {
174 //If tolerances differ from the module size and the current value is within the tolerances of a module, we accept that module size
175 if (module > tolerance) {
176 double rounded = round(val, module);
177 if (isEqual(val, rounded, tolerance))
178 return rounded;
179 }
180 return floor(val / module) * module;
181 } //roundDown
182
183
184 inline double sign(const double& val, double prec = eps)
185 { return isZero(val, prec) ? 0.0 : ((val < 0) ? -1.0 : 1.0); }
186
187
188 template <class T>
189 inline T sgn(const T& val)
190 { return (val == T()) ? T() : T((val > 0.0) ? 1.0 : -1.0); }
191 template <class T>
192 inline T flow_sgn(const T& val)
193 { return T((val >= T()) ? 1 : -1); }
194
195 //MARK: - Common angle functions
196
198 inline double angleMod(double angle) {
199 angle = fmod(angle, 2.0 * pi);
200 if (angle < 0.0)
201 angle += (2.0 * pi);
202 return angle;
203 }
205 inline bool dividesInto(double val, double div, double prec = eps)
206 { return isZero(fMod(val, div, prec), prec); }
208 inline bool isAngleBetween(double val, double lower, double upper, double prec = eps) {
209 double minA = angleMod(lower), maxA = angleMod(upper);
210 if (maxA < minA) {
211 if (val > minA)
212 maxA += (2.0 * pi);
213 else
214 minA -= (2.0 * pi);
215 }
216 return isBetween(val, minA, maxA, prec);
217 }
219 inline bool isAngleWithin(double val, double lower, double upper, double prec = eps) {
220 double minA = angleMod(lower), maxA = angleMod(upper);
221 if (maxA < minA) {
222 if (val > minA)
223 maxA += (2.0 * pi);
224 else
225 minA -= (2.0 * pi);
226 }
227 return isWithin(val, minA, maxA, prec);
228 }
230 inline bool isEqualAngle(double angle1, double angle2, double prec = eps) {
231 angle1 = angleMod(angle1);
232 angle2 = angleMod(angle2);
233 if (isEqual(angle1, angle2, prec))
234 return true;
235 if (isEqual(angle1, 2.0 * pi, prec))
236 angle1 = 0.0;
237 if (isEqual(angle2, 2.0 * pi, prec))
238 angle2 = 0.0;
239 return (isEqual(angle1, angle2, prec));
240 }
242 inline bool isParallelAngle(double angle1, double angle2, double prec = eps) {
243 angle1 = angleMod(angle1 - angle2);
244 return (isEqual(angle1, 0.0, prec) || isEqual(angle1, pi, prec) || isEqual(angle1, 2.0 * pi, prec));
245 }
247 inline bool isPerpendicularAngle(double angle1, double angle2, double prec = eps) {
248 return isParallelAngle(angle1 - pi / 2.0, angle2, prec);
249 }
251 inline double angleDelta(double angle1, double angle2) {
252 double delta = angle2 - angle1;
253 if (delta <= -pi)
254 delta += 2.0 * pi;
255 else if (delta > pi)
256 delta = 2.0 * pi - delta;
257 return delta;
258 }
259
260}
261
262#endif //ACTIVE_MATH_FUNCTIONS
Definition MathFunctions.h:16
bool isEqual(double val1, double val2, double prec=eps)
Definition MathFunctions.h:99
constexpr double eps
Default length precision (0.01mm)
Definition MathFunctions.h:22
constexpr double radianToDegree
Angle unit conversions.
Definition MathFunctions.h:29
double round(const double &val, double module=eps)
Rounding functions.
Definition MathFunctions.h:160
constexpr double inchToMillimetre
Length unit conversions.
Definition MathFunctions.h:39
int compare(double val1, double val2, double prec=eps)
Definition MathFunctions.h:117
bool isParallelAngle(double angle1, double angle2, double prec=eps)
Determine if two angles are parallel.
Definition MathFunctions.h:242
bool dividesInto(double val, double div, double prec=eps)
Determine if an angle divides cleanly into another angle.
Definition MathFunctions.h:205
bool isAngleWithin(double val, double lower, double upper, double prec=eps)
Determine if an angle is bounded within two other angles.
Definition MathFunctions.h:219
bool isGreater(double val1, double val2, double prec=eps)
Definition MathFunctions.h:108
constexpr double kilogramToMilligram
Mass unit conversions.
Definition MathFunctions.h:72
bool isAngleBetween(double val, double lower, double upper, double prec=eps)
Determine if an angle is bounded between two other angles.
Definition MathFunctions.h:208
constexpr double epsAngle
Default angle precision (0.1 degrees)
Definition MathFunctions.h:24
bool isPerpendicularAngle(double angle1, double angle2, double prec=eps)
Determine if two angles are perpendicular.
Definition MathFunctions.h:247
bool isEqualAngle(double angle1, double angle2, double prec=eps)
Determine if two angles are equal.
Definition MathFunctions.h:230
double angleMod(double angle)
Calculate an angle as a value between 0 to 2.pi radians.
Definition MathFunctions.h:198
constexpr double metre3ToLitre
Volume unit conversions.
Definition MathFunctions.h:63
double angleDelta(double angle1, double angle2)
Get a change in angle from 180 to -180.
Definition MathFunctions.h:251
constexpr double metre2ToMillimetre2
Area unit conversions.
Definition MathFunctions.h:53
bool isLess(double val1, double val2, double prec=eps)
Definition MathFunctions.h:89