如何在 C++ 中将一点移向另一点?
Posted
技术标签:
【中文标题】如何在 C++ 中将一点移向另一点?【英文标题】:How do I move one point towards another point in C++? 【发布时间】:2015-02-11 00:30:58 【问题描述】:假设我在一个无限的 2D 网格系统上有两个点。
第一个点是 (3,5) 的 X、Y 坐标集上的用户控制点。
第二个点是计算机生成的点,位于 (-20, 30) 的 X、Y 坐标集。
我希望第二个点每秒向第一个点移动 5 个单位。我已经让第二个点每 1 秒移动一次,只是没有向第一个点移动。
我需要知道如何将第二个点移向第一个点,而不是像现在这样随机移动....
顺便说一句,这是一个游戏,其中点 2 是怪物追逐点 1(玩家)。它是用 C++ 编写的。
【问题讨论】:
阅读三角函数教程。 阅读:en.m.wikipedia.org/wiki/Pythagorean_theorem 阅读 Bresenham 的画线算法。该算法是增量的,而不是绘制一个点,而是移动该点。 【参考方案1】:让我们一步一步来。
点 1 从 (x,y) 开始。点 2 位于 (x2, y2)。
它们之间的斜率是 m = (y2-y)/(x2-x)。这告诉我们什么?它告诉我们,如果我们想从点 2 移动到点 1,我们在 x 方向每移动 1 个单位,就需要在 y 方向移动 m。
所以现在我们已经有了一种算法,可以让它们彼此靠近!只是速度不合适。
我们如何计算在 x 方向上应该移动点 2 多少,以便在 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。
【讨论】:
OP 还应该审查 Bresenham 执行增量加法的算法。以上是关于如何在 C++ 中将一点移向另一点?的主要内容,如果未能解决你的问题,请参考以下文章