我正在尝试计算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?
答案 0 :(得分: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++)
{
答案 1 :(得分:1)
Nit:atan2()总是在[-pi,pi]中返回一个角度。你的第二个if语句是多余的。它也可能是一个糟糕的设计:通常你想稍后测试[pi,2pi]中的角度,这可以通过简单的&lt; 0来完成默认范围。基本上,atan2()是你的朋友,函数存在的原因是为了避免在角度上进行模块化数学的麻烦。