libhomegear-base  0.7
Base library for Homegear and Homegear family modules.
Math.h
Go to the documentation of this file.
1 /* Copyright 2013-2019 Homegear GmbH
2  *
3  * libhomegear-base is free software: you can redistribute it and/or
4  * modify it under the terms of the GNU Lesser General Public License as
5  * published by the Free Software Foundation, either version 3 of the
6  * License, or (at your option) any later version.
7  *
8  * libhomegear-base is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public
14  * License along with libhomegear-base. If not, see
15  * <http://www.gnu.org/licenses/>.
16  *
17  * In addition, as a special exception, the copyright holders give
18  * permission to link the code of portions of this program with the
19  * OpenSSL library under certain conditions as described in each
20  * individual source file, and distribute linked combinations
21  * including the two.
22  * You must obey the GNU Lesser General Public License in all respects
23  * for all of the code used other than OpenSSL. If you modify
24  * file(s) with this exception, you may extend this exception to your
25  * version of the file(s), but you are not obligated to do so. If you
26  * do not wish to do so, delete this exception statement from your
27  * version. If you delete this exception statement from all source
28  * files in the program, then also delete it here.
29 */
30 
31 #ifndef HOMEGEARMATH_H_
32 #define HOMEGEARMATH_H_
33 
34 #include <string>
35 #include <map>
36 #include <cmath>
37 #include <bitset>
38 
39 namespace BaseLib {
40 class Math {
41  public:
45  class Point2D {
46  public:
47  Point2D() {}
51  Point2D(const std::string &s);
52  Point2D(double x, double y) {
53  this->x = x;
54  this->y = y;
55  }
56  virtual ~Point2D() {}
57 
58  std::string toString() { return std::to_string(x) + ';' + std::to_string(y); }
59 
60  double x = 0;
61  double y = 0;
62  };
63 
64  typedef Point2D Vector2D;
65 
66  class Point3D {
67  public:
68  Point3D() {}
72  Point3D(const std::string &s);
73  Point3D(double x, double y, double z) {
74  this->x = x;
75  this->y = y;
76  this->z = z;
77  }
78  virtual ~Point3D() {}
79 
80  std::string toString() { return std::to_string(x) + ';' + std::to_string(y) + ';' + std::to_string(z); }
81 
82  double x = 0;
83  double y = 0;
84  double z = 0;
85  };
86 
87  typedef Point3D Vector3D;
88 
92  class Matrix3x3 {
93  public:
94  double p00 = 0;
95  double p10 = 0;
96  double p20 = 0;
97  double p01 = 0;
98  double p11 = 0;
99  double p21 = 0;
100  double p02 = 0;
101  double p12 = 0;
102  double p22 = 0;
103 
105 
106  virtual ~Matrix3x3() {}
107 
113  void inverse(Matrix3x3 &inversedMatrix);
114 
115  Math::Vector3D operator*(const Math::Vector3D &v) const;
116 
117  double determinant();
118 
119  std::string toString();
120  };
121 
125  class Line {
126  public:
127  Line() {}
128  Line(const Point2D &a, const Point2D &b) {
129  _a = a;
130  _b = b;
131  }
132  virtual ~Line() {}
133 
134  Point2D getA() const { return _a; }
135  void setA(Point2D value) { _a = value; }
136  void setA(Point2D &value) { _a = value; }
137  Point2D getB() const { return _b; }
138  void setB(Point2D value) { _b = value; }
139  void setB(Point2D &value) { _b = value; }
140 
147  void closestPointToPoint(const Point2D &p, Point2D &r);
148  protected:
151  };
152 
156  class Triangle {
157  public:
158  Triangle() {}
159  Triangle(const Point2D &a, const Point2D &b, const Point2D &c) {
160  _a = a;
161  _b = b;
162  _c = c;
163  }
164  virtual ~Triangle() {}
165 
166  Point2D getA() const { return _a; }
167  void setA(Point2D value) { _a = value; }
168  void setA(Point2D &value) { _a = value; }
169  Point2D getB() const { return _b; }
170  void setB(Point2D value) { _b = value; }
171  void setB(Point2D &value) { _b = value; }
172  Point2D getC() const { return _c; }
173  void setC(Point2D value) { _c = value; }
174  void setC(Point2D &value) { _c = value; }
175 
185  double distance(const Point2D &p, Point2D *closestPoint = nullptr);
186  protected:
190  };
191 
192  Math() = delete;
193 
198  ~Math() = default;
199 
207  static bool isNumber(const std::string &s, bool hex = false);
208 
222  static int32_t getNumber(const std::string &s, bool isHex = false);
223 
236  static int64_t getNumber64(const std::string &s, bool isHex = false);
237 
249  static int32_t getOctalNumber(const std::string &s);
250 
262  static int32_t getNumber(char hexChar);
263 
276  static uint32_t getUnsignedNumber(const std::string &s, bool isHex = false);
277 
290  static uint64_t getUnsignedNumber64(const std::string &s, bool isHex = false);
291 
292  /*
293  * Converts a float value to it's IEEE 754 binary32 representation.
294  *
295  * @param value The float value to convert.
296  * @return Returns a uint32_t with the converted value MSB first.
297  */
298  static uint32_t getIeee754Binary32(float value);
299 
300  /*
301  * Converts a float value to it's IEEE 754 binary64 representation.
302  *
303  * @param value The float value to convert.
304  * @return Returns a uint64_t with the converted value MSB first.
305  */
306  static uint64_t getIeee754Binary64(double value);
307 
308  /*
309  * Converts a value in IEEE 754 binary32 representation to float data must be MSB first.
310  *
311  * @param binary32 The binary32 value to convert.
312  * @return Returns the converted value as float.
313  */
314  static float getFloatFromIeee754Binary32(uint32_t binary32);
315 
316  /*
317  * Converts a value in IEEE 754 binary64 representation to float data must be MSB first.
318  *
319  * @param binary64 The binary64 value to convert.
320  * @return Returns the converted value as float.
321  */
322  static double getDoubleFromIeee754Binary64(uint64_t binary64);
323 
332  static double getDouble(const std::string &s);
333 
340  static std::string toString(double number);
341 
349  static std::string toString(double number, int32_t precision);
350 
359  static int32_t clamp(int32_t value, int32_t min, int32_t max);
360 
369  static double clamp(double value, double min, double max);
370 
381  static int32_t scale(int32_t value, int32_t valueMin, int32_t valueMax, int32_t scaleMin, int32_t scaleMax);
382 
393  static double scale(double value, double valueMin, double valueMax, double scaleMin, double scaleMax);
394 
398  static inline double Pow10(int32_t exponent) {
399  static const double e[] =
400  {
401  1e+0,
402  1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20,
403  1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40,
404  1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60,
405  1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80,
406  1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100,
407  1e+101, 1e+102, 1e+103, 1e+104, 1e+105, 1e+106, 1e+107, 1e+108, 1e+109, 1e+110, 1e+111, 1e+112, 1e+113, 1e+114, 1e+115, 1e+116, 1e+117, 1e+118, 1e+119, 1e+120,
408  1e+121, 1e+122, 1e+123, 1e+124, 1e+125, 1e+126, 1e+127, 1e+128, 1e+129, 1e+130, 1e+131, 1e+132, 1e+133, 1e+134, 1e+135, 1e+136, 1e+137, 1e+138, 1e+139, 1e+140,
409  1e+141, 1e+142, 1e+143, 1e+144, 1e+145, 1e+146, 1e+147, 1e+148, 1e+149, 1e+150, 1e+151, 1e+152, 1e+153, 1e+154, 1e+155, 1e+156, 1e+157, 1e+158, 1e+159, 1e+160,
410  1e+161, 1e+162, 1e+163, 1e+164, 1e+165, 1e+166, 1e+167, 1e+168, 1e+169, 1e+170, 1e+171, 1e+172, 1e+173, 1e+174, 1e+175, 1e+176, 1e+177, 1e+178, 1e+179, 1e+180,
411  1e+181, 1e+182, 1e+183, 1e+184, 1e+185, 1e+186, 1e+187, 1e+188, 1e+189, 1e+190, 1e+191, 1e+192, 1e+193, 1e+194, 1e+195, 1e+196, 1e+197, 1e+198, 1e+199, 1e+200,
412  1e+201, 1e+202, 1e+203, 1e+204, 1e+205, 1e+206, 1e+207, 1e+208, 1e+209, 1e+210, 1e+211, 1e+212, 1e+213, 1e+214, 1e+215, 1e+216, 1e+217, 1e+218, 1e+219, 1e+220,
413  1e+221, 1e+222, 1e+223, 1e+224, 1e+225, 1e+226, 1e+227, 1e+228, 1e+229, 1e+230, 1e+231, 1e+232, 1e+233, 1e+234, 1e+235, 1e+236, 1e+237, 1e+238, 1e+239, 1e+240,
414  1e+241, 1e+242, 1e+243, 1e+244, 1e+245, 1e+246, 1e+247, 1e+248, 1e+249, 1e+250, 1e+251, 1e+252, 1e+253, 1e+254, 1e+255, 1e+256, 1e+257, 1e+258, 1e+259, 1e+260,
415  1e+261, 1e+262, 1e+263, 1e+264, 1e+265, 1e+266, 1e+267, 1e+268, 1e+269, 1e+270, 1e+271, 1e+272, 1e+273, 1e+274, 1e+275, 1e+276, 1e+277, 1e+278, 1e+279, 1e+280,
416  1e+281, 1e+282, 1e+283, 1e+284, 1e+285, 1e+286, 1e+287, 1e+288, 1e+289, 1e+290, 1e+291, 1e+292, 1e+293, 1e+294, 1e+295, 1e+296, 1e+297, 1e+298, 1e+299, 1e+300,
417  1e+301, 1e+302, 1e+303, 1e+304, 1e+305, 1e+306, 1e+307, 1e+308
418  };
419  return e[exponent];
420  }
421 
431  static double metricExponentialMovingAverage(double interval, double period, double metric, double lastAverage);
432  protected:
436  static const std::array<int32_t, 23> _asciiToBinaryTable;
437 };
438 
439 }
440 
441 #endif
static double getDouble(const std::string &s)
Converts a string to double.
Definition: Math.cpp:269
Point3D()
Definition: Math.h:68
Class defining a point in 2D space with numbers of type double.
Definition: Math.h:45
Definition: Math.h:66
Math()=delete
Point2D _b
Definition: Math.h:188
static uint32_t getUnsignedNumber(const std::string &s, bool isHex=false)
Converts a string (decimal or hexadecimal) to an unsigned integer.
Definition: Math.cpp:247
Class defining a line.
Definition: Math.h:125
void setA(Point2D value)
Definition: Math.h:135
static double Pow10(int32_t exponent)
Calculates powers to the base 10.
Definition: Math.h:398
void setB(Point2D &value)
Definition: Math.h:171
virtual ~Matrix3x3()
Definition: Math.h:106
static int32_t getNumber(const std::string &s, bool isHex=false)
Converts a string (decimal or hexadecimal) to an integer.
Definition: Math.cpp:226
Line()
Definition: Math.h:127
Line(const Point2D &a, const Point2D &b)
Definition: Math.h:128
void setA(Point2D &value)
Definition: Math.h:136
Point2D getB() const
Definition: Math.h:169
static int32_t clamp(int32_t value, int32_t min, int32_t max)
Forces a value between &#39;min&#39; and &#39;max&#39;.
Definition: Math.cpp:395
Definition: BaseLib.cpp:34
Definition: Math.h:40
Class defining a triangle.
Definition: Math.h:156
double x
Definition: Math.h:60
Point2D _a
Definition: Math.h:187
void setA(Point2D value)
Definition: Math.h:167
Class defining a 3x3 matrix.
Definition: Math.h:92
static const std::array< int32_t, 23 > _asciiToBinaryTable
Map to faster convert hexadecimal numbers.
Definition: Math.h:436
static double getDoubleFromIeee754Binary64(uint64_t binary64)
Definition: Math.cpp:361
void setA(Point2D &value)
Definition: Math.h:168
static int32_t getOctalNumber(const std::string &s)
Converts a octal string to an integer.
Definition: Math.cpp:263
static int64_t getNumber64(const std::string &s, bool isHex=false)
Converts a string (decimal or hexadecimal) to an 64-bit integer.
Definition: Math.cpp:235
Point2D getB() const
Definition: Math.h:137
virtual ~Point3D()
Definition: Math.h:78
std::string toString()
Definition: Math.h:58
PVariable value
Definition: UiElements.h:217
Point2D()
Definition: Math.h:47
void setB(Point2D value)
Definition: Math.h:138
Point2D getA() const
Definition: Math.h:134
Triangle(const Point2D &a, const Point2D &b, const Point2D &c)
Definition: Math.h:159
Matrix3x3()
Definition: Math.h:104
static float getFloatFromIeee754Binary32(uint32_t binary32)
Definition: Math.cpp:351
void setB(Point2D &value)
Definition: Math.h:139
Point2D getA() const
Definition: Math.h:166
Point2D Vector2D
Definition: Math.h:64
virtual ~Triangle()
Definition: Math.h:164
Point2D _a
Definition: Math.h:149
static bool isNumber(const std::string &s, bool hex=false)
Checks if a string is a number.
Definition: Math.cpp:213
double y
Definition: Math.h:61
static uint64_t getIeee754Binary64(double value)
Definition: Math.cpp:313
void setC(Point2D &value)
Definition: Math.h:174
Point2D(double x, double y)
Definition: Math.h:52
static double metricExponentialMovingAverage(double interval, double period, double metric, double lastAverage)
Calculates the exponential moving average per time for performance metrics.
Definition: Math.cpp:421
Point3D Vector3D
Definition: Math.h:87
static uint64_t getUnsignedNumber64(const std::string &s, bool isHex=false)
Converts a string (decimal or hexadecimal) to an unsigned integer.
Definition: Math.cpp:255
~Math()=default
Destructor.
Point2D getC() const
Definition: Math.h:172
Point2D _c
Definition: Math.h:189
static uint32_t getIeee754Binary32(float value)
Definition: Math.cpp:275
void setC(Point2D value)
Definition: Math.h:173
static int32_t scale(int32_t value, int32_t valueMin, int32_t valueMax, int32_t scaleMin, int32_t scaleMax)
Scales &#39;value&#39; between &#39;valueMin&#39; and &#39;valueMax&#39; to &#39;scaleMin&#39; and &#39;scaleMax&#39;.
Definition: Math.cpp:407
virtual ~Point2D()
Definition: Math.h:56
Triangle()
Definition: Math.h:158
virtual ~Line()
Definition: Math.h:132
std::string toString()
Definition: Math.h:80
void setB(Point2D value)
Definition: Math.h:170
Point2D _b
Definition: Math.h:150
Point3D(double x, double y, double z)
Definition: Math.h:73