🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
Math.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/MathDegree.hpp"
25#include "AstUtil/Constants.hpp"
26#include <cmath>
27#include <cstddef> // for size_t
28#include <cassert>
29#include <algorithm>
30#include <type_traits>
31#include <limits> // for std::numeric_limits<double>::quiet_NaN()
32
33AST_NAMESPACE_BEGIN
34
41#ifdef A_GCC // GCC 内建 sincos 函数
42// #pragma message("Using GCC built-in sincos function")
43using ::sincos;
44
45#else
46
51A_ALWAYS_INLINE void sincos (double x, double *psin, double *pcos)
52{
53 *psin = sin(x);
54 *pcos = cos(x);
55}
56
57#endif
58
59
61class SinCos {
62public:
63 A_ALWAYS_INLINE
64 double sin() const { return sin_; }
65 A_ALWAYS_INLINE
66 double& sin() { return sin_; }
67 A_ALWAYS_INLINE
68 double cos() const { return cos_; }
69 A_ALWAYS_INLINE
70 double& cos() { return cos_; }
71public:
72 double sin_;
73 double cos_;
74};
75
76
80A_ALWAYS_INLINE SinCos sincos(double x)
81{
82 SinCos sc;
83 sincos(x, &sc.sin_, &sc.cos_);
84 return sc;
85}
86
87
88
90template<typename Scalar>
91Scalar aMax(Scalar a, Scalar b)
92{
93 return a > b ? a : b;
94}
95
97template<typename Scalar>
98Scalar aMin(Scalar a, Scalar b)
99{
100 return a < b ? a : b;
101}
102
107A_ALWAYS_INLINE size_t aDiscretizedCount(double span, double step)
108{
109 if (step <= 0.0 || span < 0.0)
110 return 0;
111 return static_cast<size_t>(std::ceil(span / step)) + 1;
112}
113
114using std::max;
115using std::min;
116
122template<typename T>
123A_CONSTEXPR_CXX14 const T& clamp(const T& val, const T& low, const T& high)
124{
125 #ifdef A_CXX14
126 assert(low <= high && "low must be less than or equal to high");
127 if(val < low){
128 return low;
129 }
130 if(val > high){
131 return high;
132 }
133 return val;
134 #else
135 return (val < low) ? low : ((val > high) ? high : val);
136 #endif
137}
138
139
143A_ALWAYS_INLINE double asinSafe(double x)
144{
145 return std::asin(clamp(x, -1.0, 1.0));
146}
147
151A_ALWAYS_INLINE double acosSafe(double x)
152{
153 return std::acos(clamp(x, -1.0, 1.0));
154}
155
159A_ALWAYS_INLINE double sqrtSafe(double x)
160{
161 return std::sqrt((std::max)(x, 0.0));
162}
163
166template<typename Scalar>
167Scalar square(Scalar x)
168{
169 return x * x;
170}
171
172
177A_ALWAYS_INLINE double aNormalizeAngleStart(double angle, double start)
178{
179 return angle - floor((angle - start) / kTwoPI) * kTwoPI;
180}
181
182
187A_ALWAYS_INLINE double aNormalizeAngle(double angle, double center)
188{
189 return aNormalizeAngleStart(angle, center - kPI);
190}
191
192
196A_ALWAYS_INLINE double aNormalizeAngle0To2Pi(double angle)
197{
198 return aNormalizeAngleStart(angle, 0);
199}
200
204A_ALWAYS_INLINE double aNormalizeAngleNegPiToPi(double angle)
205{
206 return aNormalizeAngleStart(angle, -kPI);
207}
208
212A_ALWAYS_INLINE double aNormalizeAngleNeg2PiTo0(double angle)
213{
214 return aNormalizeAngleStart(angle, -kTwoPI);
215}
216
217
219namespace propagate_nan
220{
222 A_ALWAYS_INLINE double (min)(double a, double b)
223 {
224 if(a <= b)
225 return a;
226 if(b <= a)
227 return b;
228 return std::numeric_limits<double>::quiet_NaN();
229 }
230
232 A_ALWAYS_INLINE double (max)(double a, double b)
233 {
234 if(a >= b)
235 return a;
236 if(b >= a)
237 return b;
238 return std::numeric_limits<double>::quiet_NaN();
239 }
240
241 // SWIG 无法解析 has_minus 中的 decltype SFINAE 检测,以下内部模板暂不暴露给 SWIG
242#ifndef SWIG
243 // -------------------- 类型标记:类型是否允许使用减法,需要用户通过类型特化 allow_efficient_minus 来明确允许 --------------------
244 template <typename T>
245 struct allow_efficient_minus : std::false_type {};
246
247 // -------------------- 工具:检测是否存在 operator- --------------------
248 template <typename T>
250 {
251 template <typename U>
252 static auto test(int) -> decltype(std::declval<U>() - std::declval<U>(), std::true_type());
253 template <typename U>
254 static std::false_type test(...);
255
256 static constexpr bool value = decltype(test<T>(0))::value;
257 };
258
259 // -------------------- 类型标记:是否使用减法 --------------------
260 template <typename T>
262 {
263 static constexpr bool value = allow_efficient_minus<T>::value && has_minus<T>::value;
264 };
265
266 template<typename T>
267 typename std::enable_if<!use_efficient_minus<T>::value,const T&>::type
268 (min)(const T& a, const T& b)
269 {
270 // 不支持 operator- 的类型,直接比较大小
271 if(a <= b)
272 return a;
273 if(b <= a)
274 return b;
275 if(a != a)
276 return a;
277 return b;
278 }
279 template <typename T>
280 typename std::enable_if<use_efficient_minus<T>::value, const T&>::type
281 (min)(const T& a, const T& b) {
282 // 支持 operator- 的类型,使用减法比较大小
283 auto diff = a - b; // 注意:这里会构造临时对象
284 if (diff <= 0) return a; // a <= b
285 if (diff >= 0) return b; // a >= b
286 if(a != a)
287 return a;
288 return b;
289 }
290
291 template<typename T>
292 typename std::enable_if<!use_efficient_minus<T>::value,const T&>::type
293 (max)(const T& a, const T& b)
294 {
295 // 不支持 operator- 的类型,直接比较大小
296 if(a >= b)
297 return a;
298 if(b >= a)
299 return b;
300 if(a != a)
301 return a;
302 return b;
303 }
304 template <typename T>
305 typename std::enable_if<use_efficient_minus<T>::value, const T&>::type
306 (max)(const T& a, const T& b)
307 {
308 // 支持 operator- 的类型,使用减法比较大小
309 auto diff = a - b; // 注意:这里会构造临时对象
310 if (diff >= 0) return a; // a >= b
311 if (diff <= 0) return b; // a <= b
312 if(a != a)
313 return a;
314 return b;
315 }
316#endif // !SWIG
317}
318
321AST_NAMESPACE_END
包含 sin(x) 和 cos(x) 值的结构体
定义 Math.hpp:61
constexpr double kTwoPI
2*PI
定义 Constants.hpp:55
A_ALWAYS_INLINE size_t aDiscretizedCount(double span, double step)
计算闭区间 [0, span] 按 step 步长采样(含两端点)的采样点数
定义 Math.hpp:107
A_ALWAYS_INLINE double sqrtSafe(double x)
安全平方根,参数自动箝位到 [0, +∞]
定义 Math.hpp:159
A_ALWAYS_INLINE double aNormalizeAngle0To2Pi(double angle)
将角度量规范化到 0 到 2π 范围
定义 Math.hpp:196
A_ALWAYS_INLINE double asinSafe(double x)
安全反正弦,参数自动箝位到 [-1, 1]
定义 Math.hpp:143
A_ALWAYS_INLINE double aNormalizeAngleNegPiToPi(double angle)
将角度量规范化到 -π 到 π 范围
定义 Math.hpp:204
A_CONSTEXPR_CXX14 const T & clamp(const T &val, const T &low, const T &high)
对值进行范围限制
定义 Math.hpp:123
Scalar aMax(Scalar a, Scalar b)
计算两个数中的较大值
定义 Math.hpp:91
constexpr double kPI
PI
定义 Constants.hpp:54
A_ALWAYS_INLINE double aNormalizeAngleNeg2PiTo0(double angle)
将角度量规范化到 -2π 到 0 范围
定义 Math.hpp:212
Scalar aMin(Scalar a, Scalar b)
计算两个数中的较小值
定义 Math.hpp:98
A_ALWAYS_INLINE double aNormalizeAngleStart(double angle, double start)
将角度量规范化到指定起始范围
定义 Math.hpp:177
A_ALWAYS_INLINE double aNormalizeAngle(double angle, double center)
将角度量规范化到指定中心范围
定义 Math.hpp:187
Scalar square(Scalar x)
计算平方
定义 Math.hpp:167
A_ALWAYS_INLINE double acosSafe(double x)
安全反余弦,参数自动箝位到 [-1, 1]
定义 Math.hpp:151
A_ALWAYS_INLINE void sincos(double x, double *psin, double *pcos)
计算 sin(x) 和 cos(x) 值
定义 Math.hpp:51
Unit T
特斯拉
定义 Unit.cpp:492