首页
学习
活动
专区
圈层
工具
发布

Atan2表c++
EN

Stack Overflow用户
提问于 2012-07-13 22:40:20
回答 2查看 838关注 0票数 0

我在尝试计算二维空间中两个点的角度。它可以与以下各项配合使用:

代码语言:javascript
复制
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;

但是,为了获得更好的结果,我想使用一个表:

代码语言:javascript
复制
x = player->x - x;
z = player->y - y;

return atanTable[x+32][y+32];

使用init:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-13 22:43:36

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

代码语言:javascript
复制
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++)
    {
票数 2
EN

Stack Overflow用户

发布于 2012-07-13 23:57:03

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11472722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档