Шестиугольное кольцо с радиусом N состоит из 6 прямых линий, каждая из которых имеет длину N - см. Мой чрезвычайно грубый пример ниже :) Для N = 2:
Стрелки покрывают 2 гекса каждый.
Я предполагаю, что у вас есть некоторые функции, которые дают соседний тайл в определенном направлении, например, север (), юго-восток () и т. Д. Таким образом, ваш алгоритм в псевдокоде должен выглядеть примерно так:
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, возвращающих пустой набор.
Я знаю, что код не идеален :) Здесь есть некоторая избыточность. В моих проектах, использующих регулярные мозаичные карты (шестиугольные или иные), у меня обычно есть перечисление «Направление», которое позволяет мне делать это более плавно:
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);