@devilogic
2020-05-07T12:12:05.000000Z
字数 1706
阅读 1140
我的无人车之路 mymath
角度操作在源文件angle.hpp中,使用它的时候需要一起编译sin_table.cc源文件。这里定义了函数表。角度类中使用一个正弦函数表来提高运算速度与精度。也可以通过注释掉mymath_config.h文件中的宏定义#define USE_SIN_TABLE来取消使用函数表。这样可以直接包含angle.hpp使用,无需编译。
Angle类是一模板类,接受有符号整型作为模板类型。Angle类使用整数表示角度,并支持常用的操作,例如加法和减法,以及三角函数的使用。 具有专门的Angle类可防止代码重复,即用于某些任务,例如:计算角度差或以某个指定间隔(通常为)查找等效角度。以整数表示角度具有以下优点:
1. 精度控制的级别更高('<'表示"精度低于"):Angle8 < Angle16 < float < Angle32 < double < Angle64。
2. Angle8和Angle16允许通过64-KiB查找表实现超快速三角函数。
3. 在相同的显示尺寸下精度更高。
4. 鼓励使用Angle类。特别是应将Angle32用于纬度/经度(误差小于)。Angle16足够精确,可以进行定位/物体检测。
| 函数名 | 说明 |
|---|---|
from_deg(静态函数) |
从角度制构造Angle类。 |
from_rad(静态函数) |
从弧度制构造Angle类。 |
raw_to_deg(静态函数) |
从原始值转换到角度值。 |
raw_to_rad(静态函数) |
从原始值转换到弧度值。 |
raw |
获取原始值。(角度与弧度的一个中间表示) |
to_deg |
将当前的弧度转换为角度。 |
to_rad |
将当前的角度转换为弧度。 |
operator+= |
与其他Angle类相加并自赋值。 |
operator-= |
与其他Angle类相减并自赋值。 |
operator*= |
与其他Angle类相乘并自赋值。 |
operator/= |
与其他Angle类相除并自赋值。 |
除以上类函数外,此模块还提供了一系列的重载运算符号操作。提供基础的三角函数运算操作。其中在函数中使用了SIN_TABLE固定表加快了运算。其他的运算都是基于运算的变形。模块提供了以下操作。
Angle相加。Angle相减。Angle相乘。Angle相除。Angle比较是否相等。Angle比较是否不相等。模块默认提供了以下4中类型也是四种精度。精度最低的为Angle8,最高精度为Angle64。
using Angle8 = Angle<std::int8_t>;using Angle16 = Angle<std::int16_t>;using Angle32 = Angle<std::int32_t>;using Angle64 = Angle<std::int64_t>;
模块在保存角度时使用了一个原始值的中间值。在获取具体值时通过to_deg或者to_rad函数来得到所需的单位制。
以下的一段代码揭示了它的原理。
static constexpr T RAW_PI = std::numeric_limits<T>::min();static constexpr T RAW_PI_2 = -(std::numeric_limits<T>::min() >> 1);static constexpr double DEG_TO_RAW = RAW_PI / -180.0;static constexpr double RAD_TO_RAW = RAW_PI * -M_1_PI;static constexpr double RAW_TO_DEG = -180.0 / RAW_PI;static constexpr double RAW_TO_RAD = -M_PI / RAW_PI;
double to_deg() const { return _value * RAW_TO_DEG; }double to_rad() const { return _value * RAW_TO_RAD; }