将具有立方体坐标的六边形移动到正方形结构中

时间:2019-06-16 12:24:59

标签: c# hexagonal-tiles

它适用于大多数情况:

working

当高度远大于宽度(3x9、3x11、5x11等)时,问题开始出现

not working correctly

您会看到第一行不正确,进一步增加高度将重复此模式。

下面是代码(注意:我的立方体坐标的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解决方案后,我的网格如下所示:

enter image description here

再次编辑:

我找到了一个解决方案,在更改为@Idle_Mind的解决方案之后,我再次使用y纠正了倾斜:

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

但是这引起了和以前类似的问题,但是这次我意识到这与int取整的方式有关,当y为负时xStart会比预期的低1,所以只要y为1,我就加1负面:

int add = 0;

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

现在,这就像一种魅力,谢谢大家。

2 个答案:

答案 0 :(得分:2)

将您的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));
        }
    }
}

我的测试装备:

enter image description here

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

我不明白您为什么将y值用作对x的计算的一部分。使整个列的x常数与常规网格的期望值相同。在我的代码中,较短的行仍然与较长的行在 SAME x坐标处开始;是他们的长度改变了。然后,绘制时,我只是计算法线网格的位置,但是对所有奇数y位置添加六边形的一半宽度,从而得到六边形所需的偏移量。

例如,这是一个“正常”绘制的5x5网格,不偏移奇数Y行。显然,所有行的起始X坐标都相同: enter image description here

因此,存储的x,y坐标全部基于普通网格,但是绘制代码会移动奇数y行。在这里,我更改了奇数y行的X坐标,仅用于绘制

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

因此,在添加了奇数Y行的偏移量后(再次,仅在绘制时),现在看起来像:

enter image description here

这是显示的网格,其中显示了每个六边形的内部坐标:

enter image description here

希望可以清楚地说明我的处理方式。

答案 1 :(得分:1)

我相信您只是为六边形图改变了不同的行大小。如果是这样,应该可以进行以下操作:

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();
    }
}