Gerando coordenadas triangulares / hexagonais (xyz)

Eu estou tentando chegar a uma função iterativa que gera coordenadas xyz para uma grade hexagonal. Com uma posição hexadecimal inicial (digamos 0,0,0 para simplificar), quero calcular as coordenadas para cada "anel" sucessivo de hexágonos, como ilustrado aqui:

Até agora, tudo o que consegui fazer é este (exemplo em 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);
        }
    }
}

Eu sei que cada anel contém mais seis pontos do que o anterior e cada vetor de 120 ° contém um ponto adicional para cada etapa do centro. Eu também sei quex + y + z = 0 para todos os ladrilhos. Mas como posso gerar uma lista de coordenadas que seguem a sequência abaixo?

    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

questionAnswers(4)

yourAnswerToTheQuestion