它适用于大多数情况:
当高度远大于宽度(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,我就加1负面:
int add = 0;
if (y < 0)
{
add = 1;
}
int xStart = -Width / 2 - ((y - add) / 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));
}
}
}
我的测试装备:
----------编辑----------
我不明白您为什么将y值用作对x的计算的一部分。使整个列的x常数与常规网格的期望值相同。在我的代码中,较短的行仍然与较长的行在 SAME x坐标处开始;是他们的长度改变了。然后,绘制时,我只是计算法线网格的位置,但是对所有奇数y位置添加六边形的一半宽度,从而得到六边形所需的偏移量。
例如,这是一个“正常”绘制的5x5网格,不偏移奇数Y行。显然,所有行的起始X坐标都相同:
因此,存储的x,y坐标全部基于普通网格,但是绘制代码会移动奇数y行。在这里,我更改了奇数y行的X坐标,仅用于绘制:
if (pt.Y % 2 != 0)
{
center.Offset(Width / 2, 0);
}
因此,在添加了奇数Y行的偏移量后(再次,仅在绘制时),现在看起来像:
这是显示的网格,其中显示了每个六边形的内部坐标:
希望可以清楚地说明我的处理方式。
答案 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();
}
}