计算两个 x/y 坐标之间的距离?

23
我想计算一个环面上两个x/y坐标之间的距离。这是一个普通网格,具有其角落和边缘“连接”的属性。例如,在500x500的网格上,点(499, 499)相邻于(0, 0),则(0,0)到(0,495)的距离应为5。 是否有好的数学方法来计算这个距离?

1
你总是选择最短的距离还是指定一个方向?换句话说,为什么距离是5而不是495?或者它可以是任意一个,这取决于你想要如何画线? - Niki Yoshiuchi
是的,这与最短距离有关... - Ropstah
4个回答

55

所以你想要计算一个二维环面的欧几里得距离,我理解的没错吧。

sqrt(min(|x1 - x2|, w - |x1 - x2|)^2 + min(|y1 - y2|, h - |y1 - y2|)^2)

其中wh分别表示网格的宽度(x)和高度(y)。


这个计算是否意味着0,0和0,1之间的距离比0,0和1,1之间的距离更短? - Ropstah
@ropstah:我当然希望如此。 :) - ezod
2
@ropstah:我不确定你的意思。如果你指的是“环面”的形状,不要被欧几里得3空间中环面的外观所困扰;我们只是在谈论一个欧几里得平面,其边缘以Pac-Man的方式相连,并且所有距离都如你所期望的那样。 - ezod
我已经考虑过在三维空间中不是“真实”的视觉表现。谢谢你的解释! - Ropstah
如果您正在寻找曼哈顿距离,您可以简单地编辑上面的内容:min(|x1-x2|,w-|x1-x2|)+ min(|y1-y2|,h-|y1-y2|) - George
显示剩余4条评论

8
  • 如果x坐标之间的距离大于网格X大小的一半,则将网格X大小添加到较小的x坐标。
  • 对Y坐标执行相同的操作。
  • 然后计算距离。

事实解释得很好 :) - Ropstah

4
如果您的网格在边缘处环绕,对于每个坐标(2维),将会有四个距离。我假设您想要知道最短距离。我们使用一个较小的网格,数字更容易处理,假设网格是10x10。为了简单起见,我们只使用一个维度(在这种情况下只有两个距离),就像您的例子一样。假设我们有点0,2和0,6。这两点之间的距离为d_1 = (6-2) = 4和d_2 = (10-6) + 2 = 6,因此在这种情况下,最短距离为d_1。
通常,您可以执行以下操作:
- 对于每个坐标: - 减去较小的数字 - 如果结果大于网格宽度的一半,则该坐标上的最短距离是网格宽度减去该结果 - 如果结果小于网格宽度的一半,则该坐标上的最短距离是该结果
然后使用毕达哥拉斯定理,两点之间的最短距离是每个方向上最短距离平方和的平方根。您可以通过使用每个方向上的其他距离组合计算毕达哥拉斯定理来计算其他三个距离。
正如另一位帖子所说,当您在边缘处环绕时形成的形状(对于二维网格)是一个环面,我认为我上面使用的方法与给定的方程式相同,但具有它可以扩展到n维的优点,如果需要。不幸的是,在2维以上没有真正简单的可视化方法。

0

对于点(x1,y1)和(x2,y2),您需要计算4个距离:

  • 从(x1,y1)到(x2,y2)
  • 从(x1,y1)到(x2,500-y2)
  • 从(x1,y1)到(500-x2,y2)
  • 从(x1,y1)到(500-x2,500-y2)

然后取这些距离的最小值。


1
这个不起作用:尝试使用(0,200)和(0,300)进行测试。第二个公式得出的距离为0!另外,正如其他回答中所述(或至少暗示),您可以先计算出最短的x和最短的y距离;然后您只需要应用勾股定理一次即可。 - BobS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接