【问题标题】:Calculate distance on a grid between 2 points计算两点之间网格上的距离
【发布时间】:2015-05-21 08:41:38
【问题描述】:

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

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

我正在寻找从一个单元格移动到另一个单元格的绿线中的距离。

最好公式快。

【问题讨论】:

  • 在这个例子中,您是在寻找绿线的长度还是绿线通过的单元格数?
  • @binoternary,它通过的单元格数始终为max(dx, dy)
  • @aioobe,没错,我只是想知道在这种情况下这是否是一个合适的“距离”

标签: java math language-agnostic distance


【解决方案1】:

这很简单:

  • 您沿对角线向目标移动,直到您在同一行或同一列。这将是 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;
}

【讨论】:

  • 谢谢,真的很有帮助。我再次将 double 更改为 int 因为它可以有浮点数,在我的情况下,拥有这些对于加快速度非常重要。
  • 顺便说一句,我不知道sqrt是如何实现的。既然您提到您需要快速算法,您可能希望将 private final static double SQRT_2 = Math.sqrt(2); 放在类级别并使用该常量。
猜你喜欢
  • 2010-10-30
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2014-11-14
相关资源
最近更新 更多