感谢这篇文章:六角砖并找到它们的相邻邻居,我能够将相邻砖收集到给定的砖中。但是我几乎迷上了一种算法,该算法只给我一个由偏移量指定的图块“环”。Stack Overflow帖子中给出的算法并不完全在乎它收集图块的顺序。
我知道每个偏移量都会添加6个图块。
- 偏移1为您提供6个图块(第一个相邻图块)。
- 偏移2给您12。
- 偏移3给您18,依此类推。
每个偏移量持续增长6。因此,我认为应该有一个适应这些偏移的规则。我不能完全弄清楚这一点。任何人?
感谢这篇文章:六角砖并找到它们的相邻邻居,我能够将相邻砖收集到给定的砖中。但是我几乎迷上了一种算法,该算法只给我一个由偏移量指定的图块“环”。Stack Overflow帖子中给出的算法并不完全在乎它收集图块的顺序。
我知道每个偏移量都会添加6个图块。
每个偏移量持续增长6。因此,我认为应该有一个适应这些偏移的规则。我不能完全弄清楚这一点。任何人?
Answers:
半径为N的六边形环由6条直线组成,每条直线的长度为N-参见下面的示例::对于N = 2:
箭头各覆盖2个十六进制。
我假设您有一些函数可以为您提供特定方向的相邻图块,例如north(),southeast()等。因此,您的算法(采用伪代码)应如下所示:
var point = startingPoint.north(N)
for i = 0..N-1:
result.add(point)
point = point.southeast(1);
for i = 0..N-1:
result.add(point)
point = point.south(1);
for i = 0..N-1:
result.add(point)
point = point.southwest(1);
for i = 0..N-1:
result.add(point)
point = point.northwest(1);
for i = 0..N-1:
result.add(point)
point = point.north(1);
for i = 0..N-1:
result.add(point)
point = point.northeast(1);
注意,这对于N = 1,返回6个图块,N = 0,返回空集的边缘情况也适用。
我知道代码不是完美的:)这里有些冗余。在使用规则平铺地图(六角形或其他形式)的项目中,我通常会有一个枚举“ Direction”,这使我可以更顺畅地执行此操作:
var point = startingPoint.inDir(N, Direction.North)
var dir = Direction.SouthEast.
for d = 0..Direction.count():
for i = 0..N-1:
result.add(point)
point = point.inDir(1, dir);
dir = nextDirection(dir);