6#ifndef ACTIVE_MATH_FUNCTIONS
7#define ACTIVE_MATH_FUNCTIONS
20 constexpr double pi = std::numbers::pi_v<double>;
22 constexpr double eps = 1e-5;
32 constexpr double minuteToRadian = 1.0 / radianToMinute;
33 constexpr double radianToSecond = radianToMinute * 60;
34 constexpr double secondToRadian = 1.0 / radianToSecond;
36 constexpr double gradToRadian = 1.0 / radianToGrad;
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;
48 constexpr double metreToFoot = metreToInch / footToInch;
49 constexpr double metreToYard = metreToFoot / yardToFoot;
50 constexpr double metreToMile = 0.0006213712;
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;
64 constexpr double metre3ToCentimetre3 = metre2ToCentimetre2 * metreToMillimetre;
66 constexpr double metre3ToInch3 = metre2ToInch2 * metreToInch;
67 constexpr double metre3ToFoot3 = metre2ToFoot2 * metreToFoot;
68 constexpr double metre3ToYard3 = metre2ToYard2 * metreToYard;
69 constexpr double metre3ToGallon = 264.172051;
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;
89 inline bool isLess(
double val1,
double val2,
double prec =
eps)
90 {
return (val2 - val1 > prec); }
99 inline bool isEqual(
double val1,
double val2,
double prec =
eps)
100 {
return (fabs(val1 - val2) <= prec); }
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); }
120 inline bool isLessOrEqual(
double val1,
double val2,
double prec =
eps)
121 {
return (
isEqual(val1, val2, prec) ||
isLess(val1, val2, prec)); }
123 inline bool isGreaterOrEqual(
double val1,
double val2,
double prec =
eps)
126 inline bool isLessZero(
double val,
double prec =
eps)
127 {
return isLess(val, 0.0, prec); }
129 inline bool isLessOrEqualZero(
double val,
double prec =
eps)
130 {
return isLessOrEqual(val, 0.0, prec); }
132 inline bool isZero(
double val,
double prec =
eps)
133 {
return isEqual(val, 0.0, prec); }
135 inline bool isGreaterOrEqualZero(
double val,
double prec =
eps)
136 {
return isGreaterOrEqual(val, 0.0, prec); }
138 inline bool isGreaterZero(
double val,
double prec =
eps)
141 inline bool isBetween(
double val,
double lower,
double upper,
double prec =
eps)
144 inline bool isWithin(
double val,
double lower,
double upper,
double prec =
eps)
145 {
return (isGreaterOrEqual(val, lower, prec) && isLessOrEqual(val, upper, prec)); }
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;
155 inline const T& minVal(
const T& val1,
const T& val2) {
return (val1 < val2) ? val1 : val2; }
157 inline const T& maxVal(
const T& val1,
const T& val2) {
return (val1 > val2) ? val1 : val2; }
160 inline double round(
const double& val,
double module =
eps)
161 {
return floor((val / module) + 0.5) *
module; }
163 inline double roundUp(
const double& val,
double module =
eps,
double tolerance =
eps) {
165 if (module > tolerance) {
166 double rounded =
round(val, module);
167 if (
isEqual(val, rounded, tolerance))
170 return ceil(val / module) *
module;
173 inline double roundDown(
const double& val,
double module =
eps,
double tolerance =
eps) {
175 if (module > tolerance) {
176 double rounded =
round(val, module);
177 if (
isEqual(val, rounded, tolerance))
180 return floor(val / module) *
module;
184 inline double sign(
const double& val,
double prec =
eps)
185 {
return isZero(val, prec) ? 0.0 : ((val < 0) ? -1.0 : 1.0); }
189 inline T sgn(
const T& val)
190 {
return (val == T()) ? T() : T((val > 0.0) ? 1.0 : -1.0); }
192 inline T flow_sgn(
const T& val)
193 {
return T((val >= T()) ? 1 : -1); }
199 angle = fmod(angle, 2.0 * pi);
206 {
return isZero(fMod(val, div, prec), prec); }
216 return isBetween(val, minA, maxA, prec);
227 return isWithin(val, minA, maxA, prec);
233 if (
isEqual(angle1, angle2, prec))
235 if (
isEqual(angle1, 2.0 * pi, prec))
237 if (
isEqual(angle2, 2.0 * pi, prec))
239 return (
isEqual(angle1, angle2, prec));
252 double delta = angle2 - angle1;
256 delta = 2.0 * pi - delta;
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