我已经编写了一个函数来根据位置和范围获得十六进制网格位置。从那时起,我比较了两个相同网格位置的列表,并认为那些匹配为“相交”的列表。一个直观的例子:
绿色瓷砖是两个区域的交叉瓷砖。
然后我想这样做而不生成两个列表并迭代以找到匹配的tile,因为它不是非常有效。
所以我尝试按照本指南:https://www.redblobgames.com/grids/hexagons/#range-intersection
但我真的很难理解指南那部分的逻辑,所以我可以用代码编写它。
这是我在同一指南中找到给定范围内的瓦片的方法。
public static int GetHexesInRange(Vector3 gridPosition, int range, List<Vector3> results)
{
if (range < 1)
return 0;
int count = 0;
for (int i = -range; i <= range; i++)
{
for (int j = Mathf.Max(-range, -i - range); j <= Mathf.Min(range, -i + range); j++)
{
var y = -(gridPosition.x + i) - gridPosition.z;
Vector3 tile = new Vector3(gridPosition.x - i, y, gridPosition.z - j);
Vector3 gridPos = CubeToAxial(tile);
results.Add(gridPos);
count++;
}
}
return count;
}
有没有人理解范围交集指南,我正在努力解决如何解释它写入代码。
希望有人可以提供帮助。谢谢
我相信你的困惑是因为你相信交集算法是:
该算法有效,但它不是所提出的算法,因为该算法过于笼统。我们可以提出一个更聪明,更快的算法。
在这里,让我们解决一个更简单的问题。
我将给出一组连续整数的起点和终点坐标,所以(1->5)
表示1, 2, 3, 4, 5
。如果我们有(a->b)
使得b
小于a
那么该集合是空的。
什么是(10->20)
和(15->22)
的交集?
你可以使用你的天真算法。第一组是10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
,第二组是15, 16, 17, 18, 19, 20, 21, 22
,我们通过一组说好,10,是第二组吗?没有?丢弃它。 11岁呢?通过这种方式,我们可以通过一个漫长的过程推断出答案是15, 16, 17, 18, 19, 20
。
但是有一种更简单的方法。 (a->b)
和(c->d)
的交叉点是(max(a, c) -> min(b, d))
所以我们取两个第一坐标中较大的一个 - 15
- 和两个第二坐标中较小的一个 - 20
- 我们得到的答案是(15->20)
。
现在,你可以对正方形网格中重叠的矩形做同样的事吗?
现在,你可以对立方网格中重叠的棱镜做同样的事吗?
你知道六角形瓷砖可以看作只是对那组单位立方体的限制;六角形瓦片是立方瓦片,其坐标总和为零。
现在清楚了吗?