计算2点之间的网格距离

时间:2015-05-21 08:41:38

标签: java math language-agnostic distance

我需要计算2点之间网格的距离。 允许的运动是水平的和垂直的,以及与下一个邻居的对角线(所以45度旋转)。

所以曼哈顿的距离不是一个选择。欧几里德距离也不是一个选项,因为它不会沿着网格正确移动,这可能导致一个低值(如红线所示)。

我希望得到距离,就像它从一个细胞移动到另一个细胞的绿线一样。

优先考虑公式很快。

enter image description here

1 个答案:

答案 0 :(得分:11)

这很简单:

  • 你朝着目标斜向移动,直到你要么在同一行或同一列。这将是min( dx dy )步骤。

    我们称之为 d (对角线步骤)

  • 然后你朝着球门的直线前进。这将是max( dx dy ) - d 步骤。

    我们称之为 s (直接步骤)

  • 距离为√2× d + s

在代码中:

double distance(int x1, int y1, int x2, int y2) {
    int dx = abs(x2 - x1);
    int dy = abs(y2 - y1);

    int min = min(dx, dy);
    int max = max(dx, dy);

    int diagonalSteps = min;
    int straightSteps = max - min;

    return sqrt(2) * diagonalSteps + straightSteps;
}