[关闭]
@devilogic 2020-05-07T20:12:05.000000Z 字数 1706 阅读 815

MyMath数学库(四) - 角度操作

我的无人车之路 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. Angle8Angle16允许通过64-KiB查找表实现超快速三角函数。
3. 在相同的显示尺寸下精度更高。
4. 鼓励使用Angle类。特别是应将Angle32用于纬度/经度(误差小于)。Angle16足够精确,可以进行定位/物体检测。

4.1 函数表

函数名 说明
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固定表加快了运算。其他的运算都是基于运算的变形。模块提供了以下操作。

4.2 默认类型

模块默认提供了以下4中类型也是四种精度。精度最低的为Angle8,最高精度为Angle64

  1. using Angle8 = Angle<std::int8_t>;
  2. using Angle16 = Angle<std::int16_t>;
  3. using Angle32 = Angle<std::int32_t>;
  4. using Angle64 = Angle<std::int64_t>;

4.3 弧度,角度,原始值

模块在保存角度时使用了一个原始值的中间值。在获取具体值时通过to_deg或者to_rad函数来得到所需的单位制。
以下的一段代码揭示了它的原理。

  1. static constexpr T RAW_PI = std::numeric_limits<T>::min();
  2. static constexpr T RAW_PI_2 = -(std::numeric_limits<T>::min() >> 1);
  3. static constexpr double DEG_TO_RAW = RAW_PI / -180.0;
  4. static constexpr double RAD_TO_RAW = RAW_PI * -M_1_PI;
  5. static constexpr double RAW_TO_DEG = -180.0 / RAW_PI;
  6. static constexpr double RAW_TO_RAD = -M_PI / RAW_PI;
  1. double to_deg() const { return _value * RAW_TO_DEG; }
  2. double to_rad() const { return _value * RAW_TO_RAD; }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注