从速度和方向计算速度

时间:2015-03-07 20:22:44

标签: c++ sfml trigonometry angle

我有一个想要以特定速度从A点移动到B点的对象(使用SFML C ++)。

sf::Vector2f aPos; //sf::Vector2f has two members x and y, stored as floats
sf::Vector2f bPos;
float speed; //pixels per tick

我想使用这些变量来找出速度,x速度和y速度,使vel.xvel.y的斜边长度为speed,并具有与点aPos到点bPos的轴承相同。

sf::Vector2f vel;

我能编写的最简单,最有效的函数是什么,它以sf::Vector2f aPossf::Vector2f bPosfloat speed作为参数,并返回sf::Vector2f vel

sf::Vector2f findVel(sf::Vector2f aPos, sf::Vector2f bPos, float speed) {
    sf::Vector2f vel;
    //the code I need
    return vel;
}

提前谢谢! :)

2 个答案:

答案 0 :(得分:4)

好吧,我们知道speed == distance/timevelocity == displacement/time

在第一个等式中求解1/time,得到1/time==speed/distance。我们将其替换为第二个等式以获得velocity == displacement*speed/distance

使用此公式,我们得到以下函数

sf::Vector2f findVel(sf::Vector2f aPos, sf::Vector2f bPos, float speed) {
    sf::Vector2f vel;
    float dispx = bPos.x-aPos.x;
    float dispy = bPos.y-aPos.y;
    float distance = sqrt(dispx*dispx+dispy*dispy);
    vel.x = dispx*speed/distance;
    vel.y = dispy*speed/distance;
    return vel;
}

答案 1 :(得分:4)

考虑到k_g的回答,考虑到Vector2f有运算符重载,我们实际上可以缩短它。它可以简单地成为:

sf::Vector2f findVel(const sf::Vector2f& aPos, const sf::Vector2f& bPos, float speed) {
    sf::Vector2f disp = bPos-aPos;
    float distance    = sqrt(disp.x*disp.x+disp.y*disp.y); // std::hypot(disp.x, disp.y) if C++ 11
    return disp * (speed/distance);
}

这也使我们能够从Vector类中为操作构建的任何优化中受益。

注意输入参数的更改为const &;因为你没有操纵它们,所以不需要复制它们。