0

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

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];

使用初始化:

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 ?

4

2 回答 2

2

您需要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++)
    {
于 2012-07-13T14:43:35.790 回答
1

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

于 2012-07-13T15:57:02.737 回答