从速度和方向计算速度

Calculating velocity from speed and direction

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

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作为参数,returnssf::Vector2f vel

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

提前致谢! :)

嗯,我们知道 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;
}

根据 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 class 中的任何优化操作。

注意输入参数更改为 const &;无需复制它们,因为您没有操纵它们。