余弦查找表 (costab)
基于预计算查找表的三角函数模块,提供整数和浮点两种精度,使用 16 位定点角度表示,零浮点运算开销。
原理
将 0 到 2π 均匀采样为 65536 个角度单位(0x0000 到 0xFFFF),在 [0, π/2] 区间内预计算 1024 个余弦值作为查找表。其他象限通过对称性映射:
cos(x)— 直接查表sin(x)— 利用sin(x) = cos(x - π/2),将角度加上0xC000(即 3π/2,等价于 -π/2 mod 2π)后查表
角度值自动按 65536 取模循环,无需手动处理周期。
查找表
extern const int16_t icostab[1024]; /* 整数余弦表,范围 [-32767, 32767] */
extern const float fcostab[1024]; /* 浮点余弦表,范围 [-1.0, 1.0] */
API
整数三角函数
int isin(int x); /* 返回 [-32767, 32767] */
int icos(int x); /* 返回 [-32767, 32767] */
输入为 16 位定点角度(0 到 65535 表示 0 到 2π)。输出为 15 位有符号定点数,32767 对应 1.0。
浮点三角函数
float fsin(int x); /* 返回 [-1.0, 1.0] */
float fcos(int x); /* 返回 [-1.0, 1.0] */
输入同为 16 位定点角度,输出为标准浮点值。
角度对照
| 角度值 | 弧度 | 角度 |
|---|---|---|
| 0x0000 | 0 | 0° |
| 0x4000 | π/2 | 90° |
| 0x8000 | π | 180° |
| 0xC000 | 3π/2 | 270° |
| 0xFFFF | ≈2π | ≈360° |
角度转 换公式:x = (int)(radians / (2 * PI) * 65536)
使用示例
整数精度旋转坐标
int angle = 0x2000; /* 45度 */
int x = 100, y = 0;
int nx = (x * icos(angle) - y * isin(angle)) >> 15;
int ny = (x * isin(angle) + y * icos(angle)) >> 15;
浮点精度计算
float s = fsin(0x4000); /* ≈ 1.0 (sin(90°)) */
float c = fcos(0x0000); /* ≈ 1.0 (cos(0°)) */
角度递增动画
int angle = 0;
while(1)
{
int dx = isin(angle);
int dy = icos(angle);
angle += 0x0100; /* 每步约 5.6度 */
angle &= 0xFFFF; /* 自动循环 */
}