Шестикутне кільце з радіусом 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);