2015-02-11 97 views
0

说我在无限的2D网格系统上有两个点。如何将一个点移动到C++的另一个点上?

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

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

我希望第二个点每秒向第一个点移动5个单位。我已经每秒钟移动第二点,而不是第一点。

我需要知道如何在第二点向第一点移动,而不是在一个随机的方向,因为它是现在....

这是一个游戏的方式,其中第2点是怪物追逐点1(玩家)。它正在用C++编码。

+3

阅读三角函数教程。 – 2015-02-11 00:33:27

+0

请仔细阅读:http://en.m.wikipedia.org/wiki/Pythagorean_theorem – tofi9 2015-02-11 00:36:11

+0

阅读Bresenham绘制线条的算法。该算法是增量式的,而不是*绘制*点,您移动该点。 – 2015-02-11 01:13:27

回答

3

让我们一步一步浏览一下。

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

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

所以现在我们已经有了一个算法,将它们移向彼此!只是速度不正确。

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

那么,如果我们在y x和m个单元移动1个单位,我们将已覆盖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向上或向下。

+1

OP还应该检查执行增量加法的Bresenham算法。 – 2015-02-11 01:12:35

相关问题