Generowanie współrzędnych trójkątnych / sześciokątnych (xyz)

Próbuję wymyślić funkcję iteracyjną, która generuje współrzędne xyz dla siatki sześciokątnej. Z początkową pozycją szesnastkową (powiedzmy dla prostoty 0,0,0), chcę obliczyć współrzędne dla każdego kolejnego „pierścienia” sześciokąta, jak pokazano tutaj:

Jak dotąd wszystko, co udało mi się wymyślić, to (przykład w 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);
        }
    }
}

Wiem, że każdy pierścień zawiera sześć dodatkowych punktów niż poprzedni, a każdy wektor 120 ° zawiera jeden dodatkowy punkt dla każdego kroku od środka. Też to wiemx + y + z = 0 dla wszystkich płytek. Ale w jaki sposób mogę wygenerować listę współrzędnych zgodnych z poniższą sekwencją?

    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