我有一个想要以特定速度从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.x
和vel.y
的斜边长度为speed
,并具有与点aPos
到点bPos
的轴承相同。
sf::Vector2f vel;
我能编写的最简单,最有效的函数是什么,它以sf::Vector2f aPos
,sf::Vector2f bPos
和float speed
作为参数,并返回sf::Vector2f vel
sf::Vector2f findVel(sf::Vector2f aPos, sf::Vector2f bPos, float speed) {
sf::Vector2f vel;
//the code I need
return vel;
}
提前谢谢! :)
答案 0 :(得分:4)
好吧,我们知道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;
}
答案 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 &
;因为你没有操纵它们,所以不需要复制它们。