C++ 我怎样才能使角度不显得怪异呢?

C++ 我怎样才能使角度不显得怪异呢?,c++,trigonometry,sfml,angle,C++,Trigonometry,Sfml,Angle,我不熟悉编程和SFML。我在试着做一些像佳能的东西。它会发射成弧形飞行的球。听起来这是一项非常简单的任务,但我似乎无法理解角度在SFML中是如何工作的。例如,当ang_const=0.13 Rad(7.44 Deg)时,我的球以美丽的弧线飞行。但是,当我将ang_const的值更改为0.14 Rad(8.021 Deg)时,球会朝相反的方向飞!如果我将角度更改为0.19 Rad(10.88 Deg),无论出于何种原因,它都会向下飞行 这是我的代码: #include <SFML/Graph

我不熟悉编程和SFML。我在试着做一些像佳能的东西。它会发射成弧形飞行的球。听起来这是一项非常简单的任务,但我似乎无法理解角度在SFML中是如何工作的。例如,当ang_const=0.13 Rad(7.44 Deg)时,我的球以美丽的弧线飞行。但是,当我将ang_const的值更改为0.14 Rad(8.021 Deg)时,球会朝相反的方向飞!如果我将角度更改为0.19 Rad(10.88 Deg),无论出于何种原因,它都会向下飞行

这是我的代码:

#include <SFML/Graphics.hpp>
#include <math.h>
int WIDTH = 1024, HEIGHT = 704;

class Ball {
private:
float radius = 16.00;
public:
sf::CircleShape shape;
Ball () {
    shape.setPosition(0 + radius*2, HEIGHT - radius*2);
    shape.setRadius(radius);
    shape.setFillColor(sf::Color::Cyan);
    shape.setOrigin(radius, radius);
}
void update() {
    if (x() - radius > WIDTH) {
        this->shape.setPosition(0 - radius, y());
    }
    if (x() + radius < 0) {
        this->shape.setPosition(WIDTH + radius, y());
    }
    if (y() - radius > HEIGHT) {
        this->shape.setPosition(x(), 0 - radius);
    }
    if (y() + radius < 0) {
        this->shape.setPosition(x(), HEIGHT + radius);
    }
}
float RadToDeg (float radian) {
    double pi = 3.14159;
    return radian * (180 / pi);
}
float x() { return shape.getPosition().x; }
float y() { return shape.getPosition().y; }
float getRadius() { return radius; }
};

int main()
{
// Create the main window
sf::RenderWindow window(sf::VideoMode(WIDTH, HEIGHT), "del");

// Some variables
float ang_const = 0.13;                   
float velX_const = 3.5, velY_const = 3.5; 
float grav_const = -0.02;                

float ang = ang_const;
float velX = velX_const, velY = velY_const;
float grav = grav_const;

// Text
int size_for_text = 64;
sf::Font f;
f.loadFromFile("Keyboard.ttf");
sf::Text text1;
text1.setFont(f);
text1.setCharacterSize(27);
text1.setFillColor(sf::Color::White);
text1.setPosition(size_for_text, size_for_text);

// Ball
Ball ball;

while (window.isOpen())
{
    // Process events
    sf::Event event;
    while (window.pollEvent(event))
    {
        // Close window: exit
        if (event.type == sf::Event::Closed) {
            window.close();
        }

        // Escape pressed: exit
        if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
            window.close();
        }

        // Restart
        if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space) {
            ang = ang_const;
            velX = velX_const, velY = velY_const;
            grav = grav_const;
            ball.shape.setPosition(0 + ball.getRadius()*2, HEIGHT - ball.getRadius()*2);
        }
    }

    // Ball movement
    ball.update();

    velY += grav;
    ball.shape.move(velX * cos(ball.RadToDeg(ang)),
                    velY * -sin(ball.RadToDeg(ang)));

    // Clear screen
    window.clear(sf::Color(0,0,80,100));

    // Draw ball
    window.draw(ball.shape);

    // Draw text
    text1.setString("ang " + std::to_string(ang));
    window.draw(text1);

    // Update the window
    window.display();
}

return EXIT_SUCCESS;
}
球的运动:

velY += grav;
ball.shape.move(velX * cos(ball.RadToDeg(ang)), velY * - 
sin(ball.RadToDeg(ang)));
弧度到度函数:

float RadToDeg (float radian) {
double pi = 3.14159;
return radian * (180 / pi);
}

有人能解释一下我的代码有什么问题,以及角度在SFML中是如何工作的吗?非常感谢你们的帮助。

中定义的所有三角函数的参数都是以弧度表示角度的值(参见示例)

所以,当你写这样的东西时

cos(ball.RadToDeg(ang))
如果
ang
等于,比如0.13,
RadToDeg
会将其转换为7.44,但是,即使您打算以度为单位通过一个角度,该值也会被
std::cos
(和
std::sin
)解释为7.44弧度(或66.28°)的角度

这将导致意外的结果:

cosr(7.44)=0.505(而不是cosd(7.44°)=0.993)和
cosr(8.021)=-0.166(而不是cosd(8.021°)=0.992)

cos()
sin()
以弧度为参数,而不是度。
cos(ball.RadToDeg(ang))