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

まず、期待すべき答えは (-1,0) ではなく (0,-1) です (0 が右、90 が上、180 が左、270 が下)。(1,-1) が得られる理由は、浮動小数点の制限によりcossin結果が (1e-8, -1) になるためです。次にceil、これらのうちの (1, -1) を取得します。おそらく、天井を取るよりも丸くしたいでしょう。

于 2010-10-16T09:18:22.183 に答える