如何计算2D矩阵中2个点之间的距离

时间:2013-03-02 21:10:29

标签: c matrix distance

我是这个网站的新手,也是C的新手。我需要一个程序来查找所有点的平均“跳跃”。

enter image description here

这个想法是这样的:找到从1到2,1到3,1到4 ... 1到9的“跳跃”距离,或找到2到1,2到3,2到4到5等。

在第一行执行这些操作非常简单,只需(2-1)或(3-1)即可获得正确的数字。但如果我想找到1到4或1到8之间的距离,那么我完全不知道。 矩阵的尺寸应该可以改变。但我只想要一个3x3矩阵的帮助。

任何人都可以告诉我如何找到它?

跳跃意味着从一个点到另一个点的垂直或水平移动。从1到2 = 1,从1到9 = 4(仅限最短路径)

4 个答案:

答案 0 :(得分:5)

对这类问题的“距离”定义总是很棘手。

想象一下,这些点是场上的标记,你可以自由地遍布它。然后,您可以从一个点到另一个点采取任何路径。那么最短的路线就是一条直线;它的长度是连接点的向量的长度,恰好是两个点位置之间的差异向量。这个长度可以在毕达哥拉定理的帮助下计算出来:dist = sqrt((x2-x1)^2 + (y2-y1)^2)。这被称为点之间的欧几里德距离。

现在假设你在一个城市,每个点都是一座建筑物。你不能走过建筑物,所以唯一的选择是向上/向下或向左/向右。然后,最短距离由差矢量的分量之和给出;这是一种数学方式,说“向下走2个街区,然后向左走一个街区”意味着走3个街区的距离:dist = abs(x2-x1) + abs(y2-y1)。这被称为点之间的曼哈顿距离。

然而,在您的问题中,看起来唯一可能的移动是跳转到相邻点,只需一步,允许对角线。然后问题变得有点棘手,因为路径非常不规则。这里需要一些图论,在对链接元素或“节点”的问题进行建模时非常有用。每个点都是一个节点,连接到它们的邻居,问题是找到到另一个给定点的最短路径。如果跳跃有不同的权重(例如,在对角线上跳跃更难),解决这个问题的一个简单方法就是使用Dijkstra算法;有关Wikipedia的实施的详细信息。

如果成本始终相同,则问题将减少到计算目标点的广度优先搜索中的跳转次数。

答案 1 :(得分:2)

让我们定义'跳跃'距离:“从A点[A x ,A y ]到点B [B 所需的跳数> X ,B <子>ý]“。

现在可以通过两种方式允许跳跃:

  1. 水平/垂直
    在这种情况下,您可以上/下或左/右。由于您必须独立行驶X轴和Y轴,因此您需要:jumpDistance = abs(Bx - Ax) + abs(By - Ay);

  2. 水平/垂直以及对角线
    在这种情况下,您可以上/下或左/右和对角线。它与Case 1的区别在于,现在您可以将X轴和Y轴一起更改,但只需要一次跳转。您现在的答案是:jumpDistance = Max(abs(Bx - Ax),abs(By - Ay));

答案 2 :(得分:1)

“跳跃距离”的定义是什么?

如果你的意思是一个人需要从正方形M跳到N的次数,如果他只能垂直和水平跳跃,一种可能性可以:

dist = abs(x2 - x1) + abs(y2 - y1);

例如,1到9之间的跳跃距离为:|3-1|+|3-1| = 4

答案 3 :(得分:0)

有两种方法计算跳跃距离。 1)当只允许水平和垂直移动时,在这种情况下,您要做的就是在两点之间形成一个矩形并计算两个相邻边的长度。就像您要从1移到9一样,​​然后先从1移到3再从3移到9。(将其转换为代码) 2)当允许在所有八个方向上移动时,事情就会变得棘手。假设您想从1移到6。您需要做的是从1到5,然后从5到6。在代码中这样做的方法是找到x和y坐标之差之间的最大值。在此示例中,在x坐标中,差为2(3-1),在y坐标中,差为1(2-1)。因此,最大值为2。因此,这就是答案。 (转换为代码)