将具有立方体坐标的六边形移动成正方形

Moving hexagons with cube coordinates into a square formation

它适用于大部分情况:

当高度比宽度大很多(3x9、3x11、5x11 等)时,问题就出现了

如您所见,第一行不合适,进一步增加高度将重复此模式。

这是代码(注意:我的立方体坐标的 z 和 y 被交换了):

void SpawnHexGrid(int Width, int Height)
    {
        int yStart = -Height / 2;
        int yEnd = yStart + Height;

        for (int y = yStart; y < yEnd; y++)
        {
            int xStart = -(Width + y) / 2;
            int xEnd = xStart + Width;

            if (Width % 2 == 0)
            {
                if (y % 2 == 0)
                {
                    xStart++;
                }
            }
            else
            {
                if (y % 2 != 0)
                {
                    xStart++;
                }
            }
            Debug.Log("y: " + y + " , Start: " + xStart + " , End: " + xEnd);

            for (int x = xStart; x < xEnd; x++)
            {
                SetHexagon(new Cube(x, y));
            }
        }
    }

编辑:

更改为@Idle_Mind 解决方案后,我的网格如下所示:

再次编辑:

我找到了一个解决方案,改成@Idle_Mind的解决方案后,我再次使用 y 修正了倾斜:

int xStart = -Width / 2 - (y / 2);

但这导致了与以前类似的问题,但这次我意识到它与 int 的舍入方式有关,当 y 为负时 xStart 将比预期低 1,所以我只要加 1 y 为负数:

int add = 0;

    if (y < 0)
    {
        add = 1;
    }
    int xStart = -Width / 2 - ((y - add) / 2);

这很有效,谢谢大家。

我相信您只是为六角形地图交替使用不同的行大小。如果是这样的话,这样的事情应该有效:

class Program
{
    static void Main(string[] args)
    {
        const int Height = 4;
        const int Width = 4;

        for (int y = 0; y < Height; ++y)
        {
            int rowSize = y % 2 > 0 ? Width + 1 : Width;

            for (int x = 0; x < rowSize; ++x)
            {
                Console.WriteLine($"{x}:{y}");
            }
        }

        Console.ReadLine();
    }
}

将您的 SpawnHexGrid() 更改为:

void SpawnHexGrid(int Width, int Height)
{
    int xStart = -Width / 2;
    int yStart = -Height / 2;
    int yEnd = yStart + Height;

    for (int y = yStart; y < yEnd; y++)
    {
        int xEnd = xStart + Width + (y%2==0 ? 0 : -1);

        for (int x = xStart; x < xEnd; x++)
        {
            SetHexagon(new Cube(x, y));
        }
    }
}

我的测试平台:

------------编辑---------

我不明白你为什么在计算 x 时使用 y 值。正如您对常规网格所期望的那样,使整列的 x 保持不变。在我的代码中,较短的行仍然与较长的行一样从 SAME x 坐标开始;是它们的长度发生了变化。然后,当你绘制时,我只是计算一个普通网格的位置,但是为所有奇数 y 位置添加六边形宽度的一半,从而得到六边形所需的偏移量。

例如,这里绘制了一个 5x5 网格 "normally",没有偏移奇数 Y 行。很明显,所有行的起始 X 坐标都是相同的:

所以存储的x,y坐标都是基于正常的网格,但是绘图代码移动了奇数y行。这是我更改 X 坐标的地方,仅用于绘图,奇数 y 行:

if (pt.Y % 2 != 0)
{
    center.Offset(Width / 2, 0);
}

因此,在为奇数 Y 行添加偏移量(同样,仅在绘图时)后,现在看起来像:

这里是显示每个六边形内部坐标的网格:

希望这能说明我是如何处理它的。