Как выполнить итерацию сзади на фронт в изометрической карте в форме ромба - PullRequest
2 голосов
/ 26 января 2012

Представьте себе изометрическую карту в форме ромба, которая в основном представляет собой двумерный массив с координатами (x, y) и верхней ячейкой в ​​качестве источника, как отмечено в ячейках:

Diamond

Я хочу перебрать эти ячейки сзади вперед, в следующем порядке:

iteration order

Что такое алгоритм для цикла таким образом через неизвестную одностороннюю карту?

Ожидаемый результат: [0,0], [0,1], [1,0], [0,2], [1,1], [2,0], [0,3] и т. д.

Ответы [ 2 ]

3 голосов
/ 26 января 2012

python псевдокод :

def iterate_cells(n):
    for i in range(n):
        for j in range(i+1):
            yield (j, i-j)
    for i in range(1, n+1):
        for j in range(n - i):
            yield(i+j, n-j-1)

выход:

In [119]: list(iterate_cells(5))
Out[119]: 
[(0, 0),
 (0, 1),
 (1, 0),
 (0, 2),
 (1, 1),
 (2, 0),
 (0, 3),
 (1, 2),
 (2, 1),
 (3, 0),
 (0, 4),
 (1, 3),
 (2, 2),
 (3, 1),
 (4, 0),
 (1, 4),
 (2, 3),
 (3, 2),
 (4, 1),
 (2, 4),
 (3, 3),
 (4, 2),
 (3, 4),
 (4, 3),
 (4, 4)]
0 голосов
/ 26 января 2012

Учитывая, что карта содержится в матрице M (n, n):

// lateral loop above diagonal
for (int i=0; i<n; i++) {
  // diagonal loop
  for (int j=0; j<i; j++) {
    // the coords you are looking for are: row=(i-j), col=(i+j)
    int currentTileValue = M[i-j, i+j];
  }
}
// sub-diagonal lateral loop
for (int j=1; j<n; j++) {
  // diagonal loop
  for (int i=0; i<(n-j); i++) {
    // the coords you are looking for are: row=(j-i), col=(j+i)
    int currentTileValue = M[j-i, j+i];
  }
}

не проверял это подробно, но я думаю, что это работает. В любом случае, вы поняли идею.

...