从范围获取交叉六边形[关闭]

问题描述 投票:-1回答:1

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

enter image description here

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

然后我想这样做而不生成两个列表并迭代以找到匹配的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;
    }

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

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

c# algorithm math
1个回答
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 - 和两个第二坐标中较小的一个 - 20 - 我们得到的答案是(15->20)

现在,你可以对正方形网格中重叠的矩形做同样的事吗?

现在,你可以对立方网格中重叠的棱镜做同样的事吗?

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

现在清楚了吗?

© www.soinside.com 2019 - 2024. All rights reserved.