我需要计算2点之间网格的距离。 允许的运动是水平的和垂直的,以及与下一个邻居的对角线(所以45度旋转)。
所以曼哈顿的距离不是一个选择。欧几里德距离也不是一个选项,因为它不会沿着网格正确移动,这可能导致一个低值(如红线所示)。
我希望得到距离,就像它从一个细胞移动到另一个细胞的绿线一样。
优先考虑公式很快。
答案 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;
}