c# - 两个网格单元之间的距离,没有对角线
问题描述
几天来我一直在做一个小项目,一切正常,直到我将“地图”实现更改为与我所基于的游戏(Dofus)中的相同(它是社区的小帮手) .
基本上,我有一个旋转 45° 的网格布局(见下图),从左上角到右下角构造。每个单元格都作为 xIndex 和 zIndex 来表示它在图像上的位置(xIndex ; zIndex),我只想获得两个单元格之间的距离,而不是沿对角线移动。
正如我试图在图片上解释的那样:
GetDistanceBetweenTiles(A, B) 应该是 3
GetDistanceBetweenTiles(A, C) 应该是 5
GetDistanceBetweenTiles(B, C) 应该是 2
我发现“曼哈顿距离”看起来像是我想要的,但它并没有给我上面的值。
这是代码:
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;
}
任何帮助将不胜感激。
如果它可以提供帮助,这里是使用我所做的第一个地图实现的项目(但尚未翻译)。
解决方案
让我们用简单的公式在倾斜的行中创建新坐标:
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
推荐阅读
- python - Django Rest Framework - 在同一视图集中返回不同的序列化程序
- c# - c# 如果计时器的当前时间大于
- android - 我在哪里可以找到材料指南中描述的“顶级过渡”动画?
- mysql - 降低 MySQL 中的索引增长率
- html-table - Outlook 2016:HTML 签名中的简单表格宽度未得到遵守
- javascript - 无法读取表单中未定义的属性“道具”
- python - 如何将 python 函数“any()”转换为 CUDA python 兼容代码(在 GPU 上运行)?
- php - 加入后选择不在 laravel 急切加载中工作
- c++ - C++:Bass 库用户输入位置
- amazon-web-services - 如何在 aws secrets manager 服务中管理 aws RDS(由 cloudformation 创建)的主用户凭证?