将具有立方体坐标的六边形移动成正方形
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 行添加偏移量(同样,仅在绘图时)后,现在看起来像:
这里是显示每个六边形内部坐标的网格:
希望这能说明我是如何处理它的。
它适用于大部分情况:
当高度比宽度大很多(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 行添加偏移量(同样,仅在绘图时)后,现在看起来像:
这里是显示每个六边形内部坐标的网格:
希望这能说明我是如何处理它的。