🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
Math.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/MathDegree.hpp"
25#include "AstUtil/Constants.h"
26#include <cmath>
27#include <cassert>
28#include <algorithm>
29
30AST_NAMESPACE_BEGIN
31
38#ifdef A_GCC // GCC 内建 sincos 函数
39// #pragma message("Using GCC built-in sincos function")
40using ::sincos;
41
42#else
43
48A_ALWAYS_INLINE void sincos (double x, double *psin, double *pcos)
49{
50 *psin = sin(x);
51 *pcos = cos(x);
52}
53
54#endif
55
56
58class SinCos {
59public:
60 A_ALWAYS_INLINE
61 double sin() const { return sin_; }
62 A_ALWAYS_INLINE
63 double& sin() { return sin_; }
64 A_ALWAYS_INLINE
65 double cos() const { return cos_; }
66 A_ALWAYS_INLINE
67 double& cos() { return cos_; }
68public:
69 double sin_;
70 double cos_;
71};
72
73
77A_ALWAYS_INLINE SinCos sincos(double x)
78{
79 SinCos sc;
80 sincos(x, &sc.sin_, &sc.cos_);
81 return sc;
82}
83
84
85
87template<typename Scalar>
88Scalar aMax(Scalar a, Scalar b)
89{
90 return a > b ? a : b;
91}
92
94template<typename Scalar>
95Scalar aMin(Scalar a, Scalar b)
96{
97 return a < b ? a : b;
98}
99
100using std::max;
101using std::min;
102
108template<typename T>
109A_CONSTEXPR_CXX14 const T& clamp(const T& val, const T& low, const T& high)
110{
111 #ifdef A_CXX14
112 assert(low <= high && "low must be less than or equal to high");
113 if(val < low){
114 return low;
115 }
116 if(val > high){
117 return high;
118 }
119 return val;
120 #else
121 return (val < low) ? low : ((val > high) ? high : val);
122 #endif
123}
124
125
129A_ALWAYS_INLINE double asinSafe(double x)
130{
131 return std::asin(clamp(x, -1.0, 1.0));
132}
133
137A_ALWAYS_INLINE double acosSafe(double x)
138{
139 return std::acos(clamp(x, -1.0, 1.0));
140}
141
145A_ALWAYS_INLINE double sqrtSafe(double x)
146{
147 return std::sqrt((std::max)(x, 0.0));
148}
149
152template<typename Scalar>
153Scalar square(Scalar x)
154{
155 return x * x;
156}
157
158
163A_ALWAYS_INLINE double aNormalizeAngleStart(double angle, double start)
164{
165 return angle - floor((angle - start) / kTwoPI) * kTwoPI;
166}
167
168
173A_ALWAYS_INLINE double aNormalizeAngle(double angle, double center)
174{
175 return aNormalizeAngleStart(angle, center - kPI);
176}
177
178
182A_ALWAYS_INLINE double aNormalizeAngle0To2Pi(double angle)
183{
184 return aNormalizeAngleStart(angle, 0);
185}
186
190A_ALWAYS_INLINE double aNormalizeAngleNegPiToPi(double angle)
191{
192 return aNormalizeAngleStart(angle, -kPI);
193}
194
198A_ALWAYS_INLINE double aNormalizeAngleNeg2PiTo0(double angle)
199{
200 return aNormalizeAngleStart(angle, -kTwoPI);
201}
202
205AST_NAMESPACE_END
包含 sin(x) 和 cos(x) 值的结构体
定义 Math.hpp:58
constexpr double kTwoPI
2*PI
定义 Constants.h:54
A_ALWAYS_INLINE double sqrtSafe(double x)
安全平方根,参数自动箝位到 [0, +∞]
定义 Math.hpp:145
A_ALWAYS_INLINE double aNormalizeAngle0To2Pi(double angle)
将角度量规范化到 0 到 2π 范围
定义 Math.hpp:182
A_ALWAYS_INLINE double asinSafe(double x)
安全反正弦,参数自动箝位到 [-1, 1]
定义 Math.hpp:129
A_ALWAYS_INLINE double aNormalizeAngleNegPiToPi(double angle)
将角度量规范化到 -π 到 π 范围
定义 Math.hpp:190
A_CONSTEXPR_CXX14 const T & clamp(const T &val, const T &low, const T &high)
对值进行范围限制
定义 Math.hpp:109
Scalar aMax(Scalar a, Scalar b)
计算两个数中的较大值
定义 Math.hpp:88
constexpr double kPI
PI
定义 Constants.h:53
A_ALWAYS_INLINE double aNormalizeAngleNeg2PiTo0(double angle)
将角度量规范化到 -2π 到 0 范围
定义 Math.hpp:198
Scalar aMin(Scalar a, Scalar b)
计算两个数中的较小值
定义 Math.hpp:95
A_ALWAYS_INLINE double aNormalizeAngleStart(double angle, double start)
将角度量规范化到指定起始范围
定义 Math.hpp:163
A_ALWAYS_INLINE double aNormalizeAngle(double angle, double center)
将角度量规范化到指定中心范围
定义 Math.hpp:173
Scalar square(Scalar x)
计算平方
定义 Math.hpp:153
A_ALWAYS_INLINE double acosSafe(double x)
安全反余弦,参数自动箝位到 [-1, 1]
定义 Math.hpp:137
A_ALWAYS_INLINE void sincos(double x, double *psin, double *pcos)
计算 sin(x) 和 cos(x) 值
定义 Math.hpp:48