Math 周期边界格上的距离

Math 周期边界格上的距离,math,language-agnostic,distance,Math,Language Agnostic,Distance,我有一个正方形格子,大小LxL。在这个格中,我可以使用经典的4邻格或8邻格(也包括对角线) 给定晶格(i1,j1)和(i2,j2)上两点的坐标,我想计算四邻网格和八邻网格中两点之间的距离,同时考虑周期性边界条件 对于无周期边界条件的四邻情况,距离为曼哈顿距离d=|i1-i2 |+| j1-j2 |。 如果我想考虑周期性边界,我可以计算几次距离(例如,通过(i2,j2)改变(i2,j2-L))并取最小值,但我相信有一种更有效的方法可以做到这一点 关于8邻的情况,我发现了这个问题:(在我的情况下,我

我有一个正方形格子,大小
LxL
。在这个格中,我可以使用经典的4邻格或8邻格(也包括对角线)

给定晶格
(i1,j1)
(i2,j2)
上两点的坐标,我想计算四邻网格和八邻网格中两点之间的距离,同时考虑周期性边界条件

对于无周期边界条件的四邻情况,距离为曼哈顿距离
d=|i1-i2 |+| j1-j2 |
。 如果我想考虑周期性边界,我可以计算几次距离(例如,通过
(i2,j2)
改变
(i2,j2-L)
)并取最小值,但我相信有一种更有效的方法可以做到这一点

关于8邻的情况,我发现了这个问题:(在我的情况下,我将用1替换
sqrt(2)
),但它不能解决边界条件的问题


有关于如何计算这些距离的伪代码吗?越快越好。

查找循环坐标差:

dx = Abs(x1 - x2)
if dx > L/2
   dx = L - dx
similar for dy
这种情况下的距离称为曼哈顿距离

dist = dx + dy
如果对角线移动成本为1,那么对于8邻情况,解决方案很简单-要到达新位置,必须执行dx和dy步数的最大值,但不需要更多步数,因为沿较短方向移动与沿较长方向移动相结合-对角线移动

dist = Max(dx, dy)

(还要注意,对角线部分是Min(dx,dy),水平/垂直部分是Abs(dx-dy)。这些表达式的总和等于dx,dy中的最大值)

可能不是最优的,但您应该能够得到修改链接答案以反映边界条件:它说“沿对角线向目标移动,直到您位于同一行或同一列”。在边界条件下,所有4个可能的对角线方向都可以视为“朝向目标”。在每个方向上做,取最小值。有点像你在4-nieighbor案例中已经做的。澄清一下:所谓“周期性边界条件”,你的意思是,如果一个对象从网格顶部移动,它会在底部重新出现,反之亦然,如果它离开网格的左侧,它会重新出现在网格的右侧,反之亦然?此外,给定列中的顶部和底部点
(i1,0)
(i1,L-1)
,是不同的,只是一步之遥,而不是相同的点,但是
(i1,0)
(i1,L)
是相同的点?@RoryDaulton通过周期边界,实际上,我的意思是空间具有圆环的形状,所以上下和左右是相连的。正如你所说,我使用的
(L,L)=(0,0)
,和
(i1,0)
(i1,L-1)
距离为1。回答得很好。您可能会提到(尽管这很明显)四邻情况的答案只是
dx+dy
。另外,一些关于如何为8邻案例找到正确解决方案的解释也很有启发性;例如:在8邻域的情况下,一个最佳的解决方案会使你在
x
y
两个方向上为每一个对角线步更接近一个平方,在距离更远的方向上为每一个其他步更接近一个平方。我发现把它写成dx=L/2-Abs(Abs(x1-x2)-L/2是很有用的。