计算2点之间的网格距离

cla*_*l3r 12 java language-agnostic math distance

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

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

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

公式最好是快速的.

在此输入图像描述

aio*_*obe 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,我不知道 `sqrt` 是如何实现的。既然您提到您需要算法速度快,您可能希望将“private final static double SQRT_2 = Math.sqrt(2);”放在类级别并使用该常量。 (2认同)