首页 > 解决方案 > 两个网格单元之间的距离,没有对角线

问题描述

几天来我一直在做一个小项目,一切正常,直到我将“地图”实现更改为与我所基于的游戏(Dofus)中的相同(它是社区的小帮手) .

基本上,我有一个旋转 45° 的网格布局(见下图),从左上角到右下角构造。每个单元格都作为 xIndex 和 zIndex 来表示它在图像上的位置(xIndex ; zIndex),我只想获得两个单元格之间的距离,而不是沿对角线移动。

网格

正如我试图在图片上解释的那样:

我发现“曼哈顿距离”看起来像是我想要的,但它并没有给我上面的值。

这是代码:

private int GetDistanceBetweenTiles(MovableObject a, MovableObject b)
{      
    //int dist = Mathf.Abs(a.xIndex - b.xIndex) + Mathf.Abs(a.zIndex - b.zIndex);
    int minX = a.xIndex < b.xIndex ? a.xIndex : b.xIndex;
    int maxX = a.xIndex > b.xIndex ? a.xIndex : b.xIndex;
    int minZ = a.zIndex < b.zIndex ? a.zIndex : b.zIndex;
    int maxZ = a.zIndex > b.zIndex ? a.zIndex : b.zIndex;

    int distX = (maxX - minX);
    int distZ = (maxZ - minZ);

    int dist = Mathf.Abs(maxX - minX) + Mathf.Abs(maxZ - minZ);

    print($"Distance between {a.name} and {b.name} is {dist}");

    return dist;
}

任何帮助将不胜感激。

如果它可以提供帮助,这里是使用我所做的第一个地图实现的项目(但尚未翻译)。

标签: c#unity3dmathgeometry

解决方案


让我们用简单的公式在倾斜的行中创建新坐标:

row = z/2 - x   ("/" for **integer division**)
col = z - row

现在我们可以计算曼哈顿距离为

abs(row2 - row1) + abs(col2 - col1)

对于你的例子

x   z       r   c  
4,  2  =>  -3,  5
1,  4  =>   1,  4 
distance = (1-(-3)) + (5-4) = 4 + 1 = 5

解释一下:你的网格旋转了 45 度:

  0  1  2  3  4  5  6  7  8    \column   

              40|41               row -4
           30|31|42|43            row -3   
        20|21|32|33|44|45         row -2
     10|11|22|23|34|35|46|47      row -1  
  00|01|12|13|24|15|36|37|48      row 0
     02|03|14|15|26|27|38         row 1
        04|05|16|17|28            row 2
           06|07|18               row 3

推荐阅读