我有一个大小为LxL
的正方形格子。在这个格子中,我可以有经典的4邻域网格或8邻居网格(也包括对角线)。
给定格子(i1,j1)
和(i2,j2)
上两点的坐标,我想计算它们在4邻域网格和8邻域网格之间的距离,同时考虑周期边界条件
对于4邻居情况,没有周期性边界条件,距离是曼哈顿距离d=|i1-i2|+|j1-j2|
。
如果我想考虑周期性边界,我可以多次计算距离(例如,(i2,j2)
改变(i2,j2-L)
)并采取最小值,但我确信还有更多有效的方法来做到这一点。
关于8邻居案例,我发现了这个问题:Calculate distance on a grid between 2 points(在我的情况下,我会将sqrt(2)
替换为1)但是它并没有解决边界条件的问题。
关于如何计算这些距离的任何伪代码?越快越好。
答案 0 :(得分: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),hor / vert部分为Abs(dx - dy)。这些表达式的总和等于dx,dy的最大值)