Генерация треугольных / гексагональных координат (xyz)

Я пытаюсь придумать итеративную функцию, которая генерирует координаты XYZ для гексагональной сетки. С начальной шестнадцатеричной позицией (скажем, 0,0,0 для простоты) я хочу вычислить координаты для каждого последующего «кольца» шестиугольников, как показано здесь:

Пока что все, что мне удалось придумать, это (пример в javascript):

var radius = 3
var xyz = [0,0,0];

// for each ring
for (var i = 0; i < radius; i++) {
    var tpRing = i*6;
    var tpVect = tpRing/3;
    // for each vector of ring
    for (var j = 0; j < 3; j++) {
        // for each tile in vector
        for(var k = 0; k < tpVect; k++) {
            xyz[0] = ???;
            xyz[1] = ???;
            xyz[2] = ???;
            console.log(xyz);
        }
    }
}

Я знаю, что каждое кольцо содержит на шесть точек больше, чем предыдущее, и каждый 120-градусный вектор содержит одну дополнительную точку для каждого шага от центра. Я тоже знаю чтоx + y + z = 0 для всех плиток. Но как я могу создать список координат, которые следуют последовательности ниже?

    0, 0, 0

    0,-1, 1
    1,-1, 0
    1, 0,-1
    0, 1,-1
   -1, 1, 0
   -1, 0, 1

    0,-2, 2
    1,-2, 1
    2,-2, 0
    2,-1,-1
    2, 0,-2
    1, 1,-2
    0, 2,-2
   -1, 2,-1
   -2, 2, 0
   -2, 1, 1
   -2, 0, 2
   -1,-1, 2

Ответы на вопрос(4)

Ваш ответ на вопрос