c++ - 如何在 C++ 中将一点移向另一点?

标签 c++ algorithm math mmo

假设我在无限二维网格系统上有两个点。

第一个点是 X、Y 坐标集 (3,5) 处的用户控制点。

第二个点是计算机在 X、Y 坐标集 (-20, 30) 处生成的点。

我希望第二个点每秒向第一个点移动 5 个单位。我已经让第二个点每 1 秒移动一次,只是没有向第一个点移动。

我需要知道如何将第二个点移向第一个点,而不是像现在这样随机移动....

顺便说一句,这是一个游戏,其中点 2 是一个怪物追逐点 1(玩家)。它是用 C++ 编写的。

最佳答案

让我们一步步过一遍。

点 1 从 (x,y) 开始。点 2 位于 (x2, y2)。

它们之间的斜率是 m = (y2-y)/(x2-x)。这告诉我们什么?它告诉我们,如果我们想从点 2 移动到点 1,我们在 x 方向上每移动 1 个单位,我们需要在 y 方向上移动 m。

所以现在我们已经有了一种算法,可以让它们相互靠近!只是速度不对。

我们如何计算出点 2 在 x 方向上应该移动多少,以便在 y 方向上也移动正确的量后,它总共沿对角线移动 5 个单位?

好吧,如果我们在 x 方向移动 1 个单位,在 y 方向移动 m 个单位,我们将移动 d = sqrt(1^2 + m^2) 的距离(勾股定理)

我们想在 x 方向移动一些数字 X,这样在 y 方向移动 Xm 之后,我们将移动 5 个单位。很简单:我们移动的距离是 d = sqrt(X^2 + (Xm)^2)。只需将 d 设置为 5:

5 = sqrt(X^2 + (Xm)^2)
25 = X^2 + (Xm)^2 = (m^2 + 1)*X^2
X^2 = 25/(m^2 + 1)
X = sqrt(25/(m^2 + 1))

现在,我们已经知道 m 是什么了。所以我们只需代入并求解 X。但请注意 X 始终为正。这是因为我们对方程进行了平方。因此,您必须找出 X 的正确符号。(只需检查点 1 是在点 2 的左侧还是右侧)

之后,我们将知道点 2 必须向左或向右移动 X 个单位,向上或向下移动 mX。

关于c++ - 如何在 C++ 中将一点移向另一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28444491/

相关文章:

c++ - 如何在 C++11 中处理互斥成员函数

c# - 矩阵的左上象限的最大和可以通过反转行和列来形成

java - 总是向左|向右的树中下降路径的最大长度

python - math.log(x) 在 Python 中返回意外结果

c++ - 带有标准容器的 unique_ptr : attempting to reference a deleted function

c++ - 如何在 C 或 C++ 中实现 3d kDTree 构建和搜索算法?

c++ - 在使用 ceil 的 C++ 中,除法不起作用?

c# - 将值数组四舍五入为 100%

c++ - g++:如果不使用命名空间std,则不会编译基于范围的for循环;

php - 获取嵌套关联数组中所有元素的路径和值