网格上2点之间距离的快速算法?

时间:2016-06-20 15:06:43

标签: java distance solver

给定一个宽度与长度(例如5 x 4)的网格以及该网格上的点的X和Y坐标数组,打印从网格上的每个点到坐标的距离,如下所示:

width = 5

len = 4

x coords =(2,4)

y coords =(2,3)

2123
1012
2112
2101
3212

"跨越"是+ 2,垂直或水平移动是+1

假设xCoords.length = yCoords.length

我稍后会发布我的解决方案,或者更确切地说是尝试解决方案。我试图想出一个函数来调整从网格坐标(i,j)到点的坐标的距离......我基本上是

for i .. width
  for j .. length
    getDistance(i,j, xCoords,yCoords)

(0,0)(0,1)(0,2)(0,3)

(1,0)(1,1)(1,2)(1,3)

(2,0)(2,1)(2,2)(2,3)

等...

到那些坐标处的实际距离值。

4 个答案:

答案 0 :(得分:2)

我假设你正在寻找向量中给出的距离最近的coord的距离,即

for i 0 .. width
    for j 0 .. length
        best = distance(i, j, coords[0].x, coords[0].y)
        for k 1 .. coordVector // Skip first element
            best = min(best, distance(i, j, coords[k].x, coords[k].y)
        result[i][j] = best

第三个嵌套循环检查给定坐标到(x i ,y i 向量中所有坐标的距离> ),选择最短的一个,并将其存储在变量best中。请注意,best初始化为距离向量中第一个点的距离,因此嵌套循环从第二个点开始。

现在您只需要distance的计算器。根据问题描述,您正在寻找Manhattan Distance因为对角线步长被加权为2,这意味着它与水平一步加一步垂直相同:

distance(x0, y0, x1, y1)
    horizontal = abs(x1-x0)
    vertical = abs(y0-y1)
    return horizontal + vertical

答案 1 :(得分:0)

你想使用毕达哥拉斯定理。 sqrt((i-xCords)*(i-xCords)+(j-yCords)*(j-yCords))

答案 2 :(得分:0)

int getDistance(int x1, int y1, int x2, int y2) {
    return Math.abs(x1 - x2) + Math.abs(y1 - y2);
}

答案 3 :(得分:0)

相关:I want to calculate the distance between two points in Java

距离= Math.sqrt(Math.pow((i-xCords),2)+ Math.pow((j-yCords),2));