QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCMath.cc
Go to the documentation of this file.
1// MSVC's <cmath> hides M_PI unless _USE_MATH_DEFINES is set before any C runtime header.
2#define _USE_MATH_DEFINES
3
4#include "QGCMath.h"
5
6#include <QtCore/QtNumeric>
7
8#include <cmath>
9#include <float.h>
10
11#include "CRC32.h"
12
13namespace QGC {
14
15float limitAngleToPMPIf(double angle)
16{
17 if ((angle > (-20*M_PI)) && (angle < (20*M_PI)))
18 {
19 while (angle > ((float)M_PI+FLT_EPSILON))
20 {
21 angle -= 2.0f * (float)M_PI;
22 }
23
24 while (angle <= -((float)M_PI+FLT_EPSILON))
25 {
26 angle += 2.0f * (float)M_PI;
27 }
28 }
29 else
30 {
31 // Approximate
32 angle = fmodf(angle, (float)M_PI);
33 }
34
35 return angle;
36}
37
38double limitAngleToPMPId(double angle)
39{
40 if ((angle > (-20*M_PI)) && (angle < (20*M_PI)))
41 {
42 if (angle < -M_PI)
43 {
44 while (angle < -M_PI)
45 {
46 angle += 2.0f * M_PI;
47 }
48 }
49 else if (angle > M_PI)
50 {
51 while (angle > M_PI)
52 {
53 angle -= 2.0f * M_PI;
54 }
55 }
56 }
57 else
58 {
59 // Approximate
60 angle = fmod(angle, M_PI);
61 }
62
63 return angle;
64}
65
66quint32 crc32(const quint8 *src, unsigned len, unsigned state)
67{
68 return crc32Update({src, len}, state);
69}
70
71bool fuzzyCompare(double value1, double value2)
72{
73 if (qIsNaN(value1) && qIsNaN(value2)) {
74 return true;
75 } else if (qIsNaN(value1) || qIsNaN(value2)) {
76 return false;
77 } else if (value1 == value2) {
78 return true;
79 } else {
80 return qFuzzyCompare(value1, value2);
81 }
82}
83
84bool fuzzyCompare(double value1, double value2, double tolerance)
85{
86 if (qIsNaN(value1) && qIsNaN(value2)) {
87 return true;
88 } else if (qIsNaN(value1) || qIsNaN(value2)) {
89 return false;
90 } else {
91 return fabs(value1 - value2) <= tolerance;
92 }
93}
94
95bool fuzzyCompare(float value1, float value2)
96{
97 if (qIsNaN(value1) && qIsNaN(value2)) {
98 return true;
99 } else if (qIsNaN(value1) || qIsNaN(value2)) {
100 return false;
101 } else if (value1 == value2) {
102 return true;
103 } else {
104 return qFuzzyCompare(value1, value2);
105 }
106}
107
108bool fuzzyCompare(float value1, float value2, float tolerance)
109{
110 if (qIsNaN(value1) && qIsNaN(value2)) {
111 return true;
112 } else if (qIsNaN(value1) || qIsNaN(value2)) {
113 return false;
114 } else {
115 return fabsf(value1 - value2) <= tolerance;
116 }
117}
118
119}
quint32 crc32(const quint8 *src, unsigned len, unsigned state)
Definition QGCMath.cc:66
double limitAngleToPMPId(double angle)
Definition QGCMath.cc:38
bool fuzzyCompare(double value1, double value2)
Returns true if the two values are equal or close. Correctly handles 0 and NaN values.
Definition QGCMath.cc:71
constexpr uint32_t crc32Update(std::span< const uint8_t > bytes, uint32_t state=0)
Reflected CRC-32 update; the caller supplies the initial state and final complement policy.
Definition CRC32.h:39
float limitAngleToPMPIf(double angle)
Definition QGCMath.cc:15