【问题标题】:Moving hexagons with cube coordinates into a square formation将具有立方体坐标的六边形移动为正方形
【发布时间】:2019-10-30 07:26:20
【问题描述】:

它适用于大多数情况:

当高度远大于宽度(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,所以只要 y 是我就加 1否定:

int add = 0;

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

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

【问题讨论】:

    标签: c# hexagonal-tiles


    【解决方案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();
        }
    }
    

    【讨论】:

    • 该解决方案的问题是网格不再居中。
    • 然后你必须为每个 x 坐标添加一个偏移量。你应该能够在循环之外得到它。您没有在您的问题中显示任何试图将输出居中的全局坐标系。
    【解决方案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));
            }
        }
    }
    

    我的测试台:

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

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

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

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

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

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

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

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

    【讨论】:

    • 现在看起来更清晰了,但我的六边形现在倾斜了,我用图像更新了问题。
    • 那么,我们需要看看你实际上是如何绘制六边形的。
    • 解决倾斜问题的方法是什么?
    • 查看我编辑的帖子的下半部分,了解更多您可能会觉得有用的 cmets。
    • 是的,不同之处在于我使用了立方体坐标系link。在该系统中,(1, 0) 位于 (0, 0) 的右上角, (2, 0) 位于 (1, 0) 的右上角,依此类推。这就是为什么你的解决方案一开始对我倾斜的原因。
    猜你喜欢
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多