2010-10-16 171 views
1

我正在尝试计算C++精灵的运动角度。在C++中计算精灵的坐标

虽然目前我只是使用控制台输出我的结果。

我的问题是,当我的结果显示在控制台中时,我无法使x轴进入负数。

不幸的是,我只是刚刚了解基本的三角,所以我不知道我是否只是在做我的数学错误。

例如:如果选择我的角度为270和我的速度为1,控制台显示新的坐标为(1,-1)时,我认为它应该是(-1,0)

同样,如果我尝试我的角度为-90和我的速度为1我得到(0,-1)

难道只是x不能进入负号?

还是我犯了根本错误?

我的代码如下 - 所以如果有人可以指出我在做什么错误,将不胜感激。

#include <iostream> 
#include <cmath> 

using namespace std; 

const float PI = 3.14159265; 

class sprite { 
    public: 
     int x; 
     int y; 
     int angle; 
     int speed; 
     sprite(); 
}; 

sprite::sprite() { 
    x = 0; 
    y = 0; 
    angle = 0; 
    speed = 0; 
} 

int main() { 
    int userInput = 0; 
    sprite mySprite; 

    cout << "Starting co-ordinates: (" << mySprite.x << "," << mySprite.y << ")\n\n"; 

    while(userInput != 999) { 
     cout << "Angle to move: "; 
     cin >> userInput; 
     mySprite.angle = userInput; 

     cout << "Speed to move at: "; 
     cin >> userInput; 
     mySprite.speed = userInput; 

     mySprite.x += ceil(cos(mySprite.angle*PI/180)*mySprite.speed); 
     mySprite.y += ceil(sin(mySprite.angle*PI/180)*mySprite.speed); 

     cout << "\n\n"; 
     cout << "New co-ordinates: (" << mySprite.x << "," << mySprite.y << ")\n\n"; 
    } 

    return 0; 
} 

回答

3

更改为:

mySprite.x += floor(cos(mySprite.angle*PI/180)*mySprite.speed + 0.5); 
    mySprite.y += floor(sin(mySprite.angle*PI/180)*mySprite.speed + 0.5); 

而且读this(或者其他任何你喜欢指南)明白为什么。

+0

非常感谢您的代码片段和指向浮点运算指南的链接。对于这个新手来说,这确实是一个非常有用和有趣的阅读。 – 2010-10-16 20:19:43

1

首先,您应该预期的答案是(0,-1),而不是(-1,0)(0是正确的,90是上升的,180是左的,270是下的)。您得到(1,-1)的原因是因为浮点的限制意味着您的cossin结果是(1e-8,-1)。然后你拿这些的ceil,这是(1,-1)。你可能想要轮流而不是采取上限。

+0

谢谢你的回答 - 我的想法是0度向上,这样可以很好地解决一些问题。 – 2010-10-16 20:21:25