Atan2 table c++

Atan2 table c++

本文关键字:c++ table Atan2      更新时间:2023-10-16

我正在尝试计算2D空间中两点的角度。它适用于以下内容:

double angle;
x = player->x - x;
z = player->z - y;
angle = atan2 (x, y);
angle *= (180.0 / M_PI);
if(angle < 0) angle += 360;
if(angle >= 360) angle -= 360;
return angle;

然而,我想使用一个表来获得更好的结果:

x = player->x - x;
z = player->y - y;
return atanTable[x+32][y+32];

带init:

int xp = -32;
int yp = -32;
for (int x = 0; x < 64; x++, xp++)
    for (int y = 0; y < 64; y++, yp++){
        double angle;
        angle = atan2 (xp, yp);
        angle *= (180.0 / M_PI);
        if(angle < 0) angle += 360;
        if(angle >= 360) angle -= 360;
        atanTable[x][y] = angle;
    }

角度仅针对x和y的-32到32值进行计算。

然而,该表没有正确生成。我得到的值只有359和0左右,而我应该得到0到360度的范围。

我是不是滥用了atan2?

您需要在第一个循环内重置yp,而不是在它之前。

int xp = -32;
for (int x = 0; x < 64; x++, xp++)
{
    int yp = -32; // Note, needs to be reset each time x changes.
    for (int y = 0; y < 64; y++, yp++)
    {

Nit:atan2()始终返回[-pi,pi]中的角度。你的第二个if语句是多余的。这也可能是一个糟糕的设计:通常你想稍后测试[pi,2pi]中的角度,这可以通过简单的<0表示默认范围。基本上,atan2()是你的朋友,函数存在的原因是为了让你省去在角度上进行模块化数学的麻烦。