如何在Python上计算2D网格中单元格之间的距离?

问题描述 投票:2回答:1

我的例子和问题的例子很接近 Python:如何计算单元格之间的距离?我想计算2个单元格之间的距离,但考虑到相邻单元格之间的距离总是1(包括对角线)。让我解释一下。

假设我有以下二维网格

20  21  22  23  24
15  16  17  18  19
10  11  12  13  14
5   6   7   8   9
0   1   2   3   4

我想要的是一个函数,它的参数是2个单元格的指数,并返回它们之间的距离,因此相邻单元格之间的距离是1(对角线单元格也是相邻的)。

我已经尝试过这样的东西。

import numpy as np
import numba as nb

@nb.njit # to speed up the code with numba
def distance(a,b,n=5):
    x1 = a%n;  x2 = b%n;
    y1 = a//n; y2 = b//n
    return np.floor(np.sqrt( (x1-x2)**2 + (y1-y2)**2 ))

然而,这对一些单元格有效,但对另一些单元格则无效,比如说。

>>> distance(2,7)
1.0 # works!
>>> distance(3,11)
2.0 # works!
>>> distance(0,24)
5.0 # wrong! it should be 4.0
>>> distance(0, 23)
5.0 # wrong! it should be also 4.0

我的意思是,我认为线性距离计算得很好 但对角线的距离并不完全是这样

python numpy cell distance
1个回答
3
投票

试试。

def distance(a, b, n=5):
    x1 = a%n;  x2 = b%n;
    y1 = a//n; y2 = b//n
    dx = abs(x1 - x2)
    dy = abs(y1 - y2)
    return max([dx, dy])
>>> distance(2,7)
1
>>> distance(3,11)
2
>>> distance(0,24)
4
>>> distance(0, 23)
4

解释:

我们可以想象一下,如果我们想以最短的距离从a点到b点,我们要先用尽尽可能多的对角线移动。如果没有对角线,我们就必须进行 dx + dy 的移动次数,然而由于我们可以向对角线方向移动,所以我们可以在一次移动中有效地向两个方向移动。这意味着两个棋子中较小的(dxdy)变得无关紧要,因为如果 dy =10和 dx = 5,我们已经需要在垂直方向上移动10次,所以我们可以通过将其中5次垂直移动掩盖成对角线移动来捕捉水平方向上的5次移动。因此,答案是 max([dx, dy]).

© www.soinside.com 2019 - 2024. All rights reserved.