从范围获取相交的六边形

时间:2018-03-05 23:59:21

标签: c# algorithm math

我已经编写了一个函数来根据位置和范围获取十六进制网格位置。从那时起,我比较了相同网格位置的两个列表,并将那些匹配为#34;相交的"。一个直观的例子:

enter image description here

绿色瓷砖是两个区域的交叉瓷砖。

然后我想这样做而不生成两个列表并迭代以找到匹配的tile,因为它不是非常有效。

所以我尝试按照本指南操作: https://www.redblobgames.com/grids/hexagons/#range-intersection

但我真的很难理解指南那部分的逻辑,所以我可以用代码写出来。

这是我在同一指南中找到给定范围内的图块的方法。

.Where(o => usersFollowingList.Contains(o.ApplicationUser.Id) || o.ApplicationUser.Id == loggedinUser.Id)

是否有人理解范围交叉指南,我正在努力解决如何解释它以写入代码。

希望有人可以提供帮助。 感谢

1 个答案:

答案 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

现在,您可以对在正方形网格中重叠的矩形进行相同的操作吗?

现在,您可以对立方网格中重叠的棱镜执行相同的操作吗?

你知道六角形瓷砖可以看作是对这组单位立方体的限制;六角形瓷砖是立方体瓷砖,其坐标总和为零。

现在很清楚了吗?