从速度和方向计算速度
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.x
和 vel.y
的斜边长度为 speed
,并且与点aPos
到点bPos
.
的方位相同
sf::Vector2f vel;
我能写出的最简单有效的函数是什么,它将sf::Vector2f aPos
、sf::Vector2f bPos
和float 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/time
和 velocity == 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 &
;无需复制它们,因为您没有操纵它们。
我有一个对象想要以一定的速度(使用 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.x
和 vel.y
的斜边长度为 speed
,并且与点aPos
到点bPos
.
sf::Vector2f vel;
我能写出的最简单有效的函数是什么,它将sf::Vector2f aPos
、sf::Vector2f bPos
和float 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/time
和 velocity == 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 &
;无需复制它们,因为您没有操纵它们。