沿直线移动的算法
Algorithm for movement along linear line
代码:
我的功能如下:
bool Action::approach (img_comp &mover, sf::Vector2f start, sf::Vector2f end, int speed)
{
//Get the change in x and y
float delta_x = (end.x - start.x) / speed;
float delta_y = (end.y - start.y) / speed;
//Move the sprite
mover.sprite.move(delta_x, delta_y);
//Check if the sprite has met the end
if (mover.sprite.getPosition() == end)
return true;
return false;
}
(其中sf::Vector2f
基本上是具有x
和y
浮点参数的结构,例如x-y网格上的点)
问题:
不出所料,由于float
的四舍五入,该函数在通过终点后有可能永远不会返回true。在这种情况下,我使用什么算法使我的精灵准确地落在end
点上,而不考虑舍入?
注意:宽容不是我问题的答案。这只是一种妥协。我想要的算法是第一次完美地选择点,而不考虑任何舍入。如果这是不可能的,请告诉我。
我想你已经有了答案,因为float
的四舍五入,你不应该做mover.sprite.getPosition() == end
,而是看看mover.sprite.getPosition() - end
是否小于某个数字,比如
float diff = mover.sprite.getPosition() - end;
if (diff < 0)
diff *= -1;
//Check if the sprite has met the end
if (diff > 0.01)
return true;
这样你就不会检查你是否在现场,而是检查你是否离现场足够近。要改进这一点,你也可以做:
float diff = mover.sprite.getPosition() - end;
if (diff < 0)
diff *= -1;
//Check if the sprite has met the end
if (diff > 0.01){
mover.sprite.getPosition() = end; //this might not be the exact syntax but the idea is clear i hope
return true;
}
您的精灵可以向左或向右,因此您应该考虑使用当前位置和终点之间的绝对差。
Epsilon = 1e-9
deltaX = (end.x - start.x) / speed
deltaY = (end.y - start.y) / speed
dirX = Math.sgn(deltaX)
dirY = Math.sgn(deltaY)
mover.sprite.move(deltaX, deltaY);
crossedEndX = dirX * (mover.sprite.getPosition().x - end.x) > Epsilon
crossedEndY = dirY * (mover.sprite.getPosition().y - end.y) > Epsilon
if(crossedEndX && crossedEndY)
return true
您可以执行类似"如果点接近终点,则点=终点"的操作,而不是直接比较
/* Set TOLERANCE to whatever makes sense.
* Could have different X and Y values too...
*/
#define TOLERANCE 0.01
sf::Vector2f &newPos = mover.sprite.getPoition();
if (abs(newPos[0] - end[0]) < TOLERANCE &&
abs(newPos[1] - end[1]) < TOLERANCE) {
{
mover.sprite.setPosition(end);
result = true;
}
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何使用 GPS 和指南针开发点移动算法
- 在 stl 算法中移动迭代器
- 我可以在移动平台上有效地使用用C/C 编写的数字算法
- 带有 SFML 的 c++ 中的过程无法正常工作,移动算法
- 用于将优先级链接移动到列表标题的算法
- 骑士团索引和移动算法错误
- 算法,用于查找获取排序列表所需的最小移动元素到结束步骤
- 如何在BFS算法中计算移动?(迷宫中的最短路径)
- 有没有解决方案而不是在C++中移动背包回溯算法
- 没有对角线移动的Dijkstra算法
- 通过贪婪算法找到最小移动次数
- 在电子邮件地址内移动点(句点)的算法
- 基于图像的计数算法,用于对移动输送机上的物体进行计数
- 沿直线移动的算法
- 小硬核:你知道任何并行修正的移动平均算法吗?
- 我是否需要知道算法的代码才能利用插入器和移动迭代器?
- 作用于可移动但不可复制对象序列的变化STL算法的行为