0%

02 - 数学计算工具类

1. 常用数学常量

1
2
3
4
5
6
7
8
9
10
11
// 定义和 pi 有关的常量
const float kPi = 3.14159265f;
const float k2Pi = kPi * 2.0f;
const float kPiOver2 = kPi / 2.0f;
const float k1OverPi = 1.0f / kPi;
const float k1Over2Pi = 1.0f / k2Pi;
const float kPiOver180 = kPi / 180.0f;
const float k180OverPi = 180.0f / kPi;

// 定义零向量
const Vector3 kZeroVector(0.0f, 0.0f, 0.0f);

2. 成员函数

1
2
3
4
5
6
7
// 通过加上适当的 2pi 倍数,将角度限制在 -pi 到 pi 的区间内
float wrapPi(float theta) {
theta += kPi;
theta -= floor(theta * k1Over2Pi) * k2Pi;
theta -= kPi;
return theta;
}
  • θ\theta 减去向下取 2π2\pi 的整数倍,使得 θ[π,π]\theta \in [- \pi,\pi]

θ=θθ+π2π2ππ\theta = \theta - \left \lfloor {\frac {\theta + \pi} {2 \pi}} \right \rfloor * 2 \pi - \pi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// “安全”反三角函数
//
// 和 acos(x) 相同,但如果 x 超出范围将返回最为接近的有效值
//
// 返回值在 0 到 pi 之间,和 C 语言中的标准 acos() 函数相同
float safeAcos(float x) {

// 检查边界条件

if (x <= -1.0f) {
return kPi;
}
if (x >= 1.0f) {
return 0.0f;
}

// 使用标准 C 函数

return acos(x);
}


// 在度数和弧度之间转换
inline float degToRad(float deg) { return deg * kPiOver180; }
inline float radToDeg(float rad) { return rad * k180OverPi; }


// 计算角度的 sin 和 cos 值
// 在某些平台上,如果需要这两个值,同时计算要比分开计算快
inline void sinCos(float* returnSin, float* returnCos, float theta) {

// 只使用标准三角函数
*returnSin = sin(theta);
*returnCos = cos(theta);
}


// “视野”和“缩放”之间的转换
// 视场角度以弧度表示。
inline float fovToZoom(float fov) { return 1.0f / tan(fov * .5f); }
inline float zoomToFov(float zoom) { return 2.0f * atan(1.0f / zoom); }