如何找到二维数组中两个元素之间的距离

How to find the distance between two elements in a 2D array

假设您有网格:

list = [[-,O,-,-,O,-,],
        [O,-,-,-,-,O],
        [O,O,-,-,X,-],
        [-,-,O,-,-,-]]

你如何获得距离 X 3 以内的所有 O 的坐标? 从我在其他答案中看到的情况来看,使用 scipy.spatial.KDTree.query_ball_point 似乎是一种常见的方法,但我无法弄清楚如何使其适应我的用例。我有一个可能的想法是存储列表的每个坐标,例如 coords=[[0,0],[0,1]...]然后使用scipy方法,传入X坐标和搜索距离。然后,一旦我收到可能的坐标列表,我就会遍历列表并检查哪些坐标等于 O。但是,我想知道是否可以使用更有效或更优化的解决方案。任何帮助将不胜感激。

您不需要使用 Scipy 让它变得太复杂。这道题只要借助数学就可以轻松解决。

圆内坐标方程为x^2 + y^2 <= Radius^2,所以只需要检查圆内坐标即可

list = [[-,O,-,-,O,-,],
        [O,-,-,-,-,O],
        [O,O,-,-,X,-],
        [-,-,O,-,-,-]]
X_coor = #Coordinate of X, in this case y = 2, x = 4
d = #Maximum distance from X in this case d = 3
total = 0
O_coor = [] #Store coordinate of all O near X
for y in range(max(0, X_coor.y - d), min(list.length - 1, X_coor.y + d)):
    for x in range(max(0, X_coor.x - sqrt(d**2 - (y - X_coor.y)**2)), min(list.length - 1, X_coor.x + sqrt(d**2 - (y - X_coor.y)**2))):
        if list[y][x] == "O":
            total++
            O_coor.append([x, y])
print(total)
print(O_coor)

代码很长,有不懂的地方可以问我

注意:这个解决方案只检查圆圈区域的坐标而不是整个列表,所以即使你有大列表这仍然非常快。