Хранение данных сетки шестиугольной формы в массиве

Я создаю сетку шестиугольной формы, как описано на веб-сайте Амита Пателя redblobgames.com

Я проверил сетку, и все, включая координаты, правильно.

Теперь я хотел бы сохранить данные сетки в массив. Я частично разобрался, однако основная проблема в том, что некоторые столбцы начинаются с индекса 1 вместо 0.

Поэтому я хотел бы найти способ разместить гексы в одном порядке, но начать все с 0.

Индекс должен быть рассчитан по квадратным позициям [q, r, -q-r], чтобы я мог затем получить доступ к массиву, используя ту же технику.

вот как я сейчас создаю сетку и сохраняю данные:

for (var q = -this.grid_r; q <= this.grid_r; q++) {
        var r1 = Math.max(-this.grid_r, -q - this.grid_r);
        var r2 = Math.min(this.grid_r, -q + this.grid_r);
        for (var r = r1; r <= r2; r++) {
            row = r + this.grid_r ;
            col = (q+Math.floor(r/2)) + this.grid_r;
            if( ! this.hexes[ row ] ){
                this.hexes[ row ] = [];
            }
            n_hex = new Hex( q, r, this.layout );
            this.hexes[ row ][ col ] = n_hex;
        }
    }

Вот как массив выглядит с точки зрения данных.

    0   1   2   3   4   5   6
0       0   0   0   0   
1       0   0   0   0   0 
2   0   0   0   0   0   0   
3   0   0   0   0   0   0   0
4   0   0   0   0   0   0   
5       0   0   0   0   0   
6       0   0   0   0   

Я просто хочу избежать использования каких-либо условий в методах рисования или обновления, чтобы проверить, пуст ли столбец или нет.

draw: function( ctx ){
        for( var r = 0, r_l = this.hexes.length; r < r_l;  r++ ){
            for( var c = 0, c_l = this.hexes.length; c < c_l;  c++ ){
               if( typeof( this.hexes[r][c]) !== "undefined" ){ 
                   this.hexes[r][c].draw( ctx );
               }
            }
        }
    },

person Alexus    schedule 01.07.2016    source источник


Ответы (1)


Ваш внешний цикл — q, а внутренний — r. Ваши индексы массива должны следовать той же структуре, с this.hexes[col][row] вместо this.hexes[row][col]:

for (var q = -this.grid_r; q <= this.grid_r; q++) {
    var r1 = Math.max(-this.grid_r, -q - this.grid_r);
    var r2 = Math.min(this.grid_r, -q + this.grid_r);
    for (var r = r1; r <= r2; r++) {
        col = q + this.grid_r;
        row = r - r1;
        if (!this.hexes[col]) { this.hexes[col] = []; }
        this.hexes[col][row] = new Hex(q, r, this.layout);
    }
}

col будет q минус место начала цикла q (-this.grid_r). row будет r минус место начала цикла r (r1).

person amitp    schedule 01.07.2016