1

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

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

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

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

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

同样,如果我尝试将角度设为 -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;
}
4

2 回答 2

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

并阅读(或您喜欢的任何其他指南)以了解原因。

于 2010-10-16T09:10:33.570 回答
1

首先,您应该期望的答案是 (0,-1),而不是 (-1,0)(0 是右,90 是上,180 是左,270 是下)。你得到 (1,-1) 的原因是因为浮点数的限制意味着你cossin结果是 (1e-8, -1)。然后你取其中ceil的一个,它们是 (1, -1)。您可能想要舍入而不是采取天花板。

于 2010-10-16T09:18:22.183 回答