当前位置: 首页 > 知识库问答 >
问题:

环绕六边形图中的距离计算

柳韬
2023-03-14
public static Integer distance(HexCubeCoord origin, HexCubeCoord destination) {
    // Normalize destination taking origin to (0, 0)
    Integer dR = destination.getGridR() - origin.getGridR();
    Integer dC = destination.getGridC() - origin.getGridC();
    // Wrap normalized distance
    HexCubeCoord normDest = new HexCubeCoord(HexCalculator.wrapR(dR), HexCalculator.wrapC(dC));
    // Calculate distances to (0, 0) and the other three mirror origins
    Integer d0 = simpleDistance(new HexCubeCoord(0, 0), normDest);
    Integer d1 = simpleDistance(new HexCubeCoord(0, HexGridData.getColCount()), normDest);
    Integer d2 = simpleDistance(new HexCubeCoord(HexGridData.getRowCount(), 0), normDest);
    Integer d3 = simpleDistance(new HexCubeCoord(HexGridData.getRowCount(), HexGridData.getColCount()), normDest);
    // Return the min of those four distances
    return Math.min(Math.min(Math.min(d0, d1), d2), d3);
}

public static Integer simpleDistance(HexCubeCoord origin, HexCubeCoord destination) {
    Integer dR = destination.getGridR() - origin.getGridR();
    Integer dC = destination.getGridC() - origin.getGridC();
    Integer dZ = - dC - dR;
    return Math.max(Math.max(Math.abs(dR), Math.abs(dC)), Math.abs(dZ));
}

共有1个答案

皇甫高阳
2023-03-14

经过大量的工作和时间,我终于得到了一个似乎适用于所有测试用例的距离计算。

我希望可以回答我自己的问题,我把最终的距离计算贴在一个环绕的六边形地图中,以防其他人觉得有趣。

public static Integer distance(HexCubeCoord origin, HexCubeCoord destination) {
    // Normalize destination taking origin to (0, 0)
    Integer dR = destination.getGridR() - origin.getGridR();
    Integer dC = destination.getGridC() - origin.getGridC();
    // Wrap normalized distance to get closer to (0, 0)
    // Wrap c-wise
    if (Math.abs(dC) >= HexGridData.getColCount() / 2) {
        dC = (HexGridData.getColCount() - Math.abs(dC)) * (- Integer.signum(dC));
    }
    // Wrap r-wise
    if (Math.abs(dR) >= (HexGridData.getRowCount() / 2) - Math.floor(dC / 2)) {
        dR = (HexGridData.getRowCount() - Math.abs(dR)) * (- Integer.signum(dR));
    }
    Integer dZ = (- dC - dR);
    // Calculate distance in the usual form
    return Math.max(Math.max(Math.abs(dR), Math.abs(dC)), Math.abs(dZ));
}

它从https://blog.demofox.org/2017/10/01/computing-the-distance-better-points-in-points-in-wrap-around-toroidal-space/中概述的方法开始,但是当包装R时,我添加了“-math.floo(dC/2)”部分,以补偿网格在(+,+)---(-,-)对角线上的同化。

 类似资料:
  • 我要做的是找出在一个六角网格上,两点之间有多少个六边形。我试着在网上搜索一个公式,但我无法找到一个匹配类型的十六进制网格我正在使用。

  • 我有一个六边形网格,就像图中的一样,我试图找到最简单的方法(也许是一个公式)来计算这个网格内两个六边形之间的距离。当然,我的网格的大小比这更大,但是当我们计算规则网格(有水平和垂直轴)中两个节点之间的距离时,我试图找到一个类似于欧几里得距离公式的公式。 我读了一些方法,但他们都说Y轴应该是60度,然后他们提供了一些公式(六角网格中瓷砖之间的曼哈顿距离)。是否有一种方法来计算距离使用“坐标系”相同,

  • 我需要创建一个十六进制瓷砖地图,最多使用19种颜色,其中每种颜色必须保持至少3瓷砖的距离。然而,我不需要使用所有19种颜色。如果有一种算法可以用少于19种颜色来解决这个距离限制,这是完全可以的。 贝克曼-夸尔斯定理[1]看起来是相关的,有一个7色瓷砖图显示了相同颜色的瓷砖彼此之间保持2的距离。 但是我很难找到一个可以理解的描述,甚至是构建距离为3的十六进制贴图的实现。 [1]http://de.w

  • 我被一个似乎很容易解决的问题所困扰,但我似乎找不出正确的公式。 我有一个立方体坐标系中六边形群的列表。我知道群的立方体坐标,但我需要计算给定群中一个小六边形的“全局”坐标。 例如,在下图中,我知道和的坐标。如果每个组都有相同的半径(在本例中半径为1),并且它们之间不重叠(让我们把它看作是从0、0、0开始的组的平铺,从而创建一个十六进制网格),那么我如何计算GroupB中心平铺的坐标呢? 任何帮助都

  • 改变这个.. 对此..

  • 我需要计算汽车行驶的距离!不是距离,不是距离到否。如果我们通过谷歌提供的API计算,距离可以完全不同。谷歌可以提供从一个点到另一个点的1公里距离,但汽车可以按照骑手想要的方式行驶800米。使用加速计没有帮助。它适用于步行,但绝不适用于更快的速度。 我尝试过使用Google的位置API:距离到或距离之间根本不是一个选项。它可以给出与IN REAL截然不同的结果。在真实的汽车中,可以通过非常短的地方并