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