我已经编写了一个函数来根据位置和范围获取十六进制网格位置。从那时起,我比较了相同网格位置的两个列表,并将那些匹配为#34;相交的"。一个直观的例子:
绿色瓷砖是两个区域的交叉瓷砖。
然后我想这样做而不生成两个列表并迭代以找到匹配的tile,因为它不是非常有效。
所以我尝试按照本指南操作: https://www.redblobgames.com/grids/hexagons/#range-intersection
但我真的很难理解指南那部分的逻辑,所以我可以用代码写出来。
这是我在同一指南中找到给定范围内的图块的方法。
.Where(o => usersFollowingList.Contains(o.ApplicationUser.Id) || o.ApplicationUser.Id == loggedinUser.Id)
是否有人理解范围交叉指南,我正在努力解决如何解释它以写入代码。
希望有人可以提供帮助。 感谢
答案 0 :(得分:4)
我相信你的困惑是因为你相信交叉算法是:
该算法工作,但它不是所提出的算法,因为该算法过于笼统。我们可以提出一种更聪明,更快速的算法。
在这里,让我们解决一个更简单的问题。
我将给出一组连续整数的起点和终点坐标,因此(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
- 和两个第二坐标中的较小坐标 - { {1}} - 我们得到的答案是20
。
现在,您可以对在正方形网格中重叠的矩形进行相同的操作吗?
现在,您可以对立方网格中重叠的棱镜执行相同的操作吗?
你知道六角形瓷砖可以看作是对这组单位立方体的限制;六角形瓷砖是立方体瓷砖,其坐标总和为零。
现在很清楚了吗?