ダイヤモンド型の等尺性マップを想像してください。これは基本的に(x、y)座標と最上位セルを原点とする2D配列です細胞:ダイヤモンド型アイソメメトリーマップの先頭から最後まで繰り返す方法
私は次の順序で、後ろから前にこれらの細胞を反復処理したい:
不明same-を通じて、このようにループするためのアルゴリズムは何両面m AP?
予想される出力:[0,0]、[0,1]、[1,0]、[0,2]、[1,1]、[2,0]、[0,3]など
ダイヤモンド型の等尺性マップを想像してください。これは基本的に(x、y)座標と最上位セルを原点とする2D配列です細胞:ダイヤモンド型アイソメメトリーマップの先頭から最後まで繰り返す方法
私は次の順序で、後ろから前にこれらの細胞を反復処理したい:
不明same-を通じて、このようにループするためのアルゴリズムは何両面m AP?
予想される出力:[0,0]、[0,1]、[1,0]、[0,2]、[1,1]、[2,0]、[0,3]など
パイソン擬似コード:
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)]
マップは行列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];
}
}
は詳細にそれをテストしていないが、私はそれがうまくいくと思うと思います。とにかくあなたはアイデアを得る。
ありがとう! 残念ながら、最初の "for"の条件はオフに見えます。これらの値を使用すると、条件は合格し、値は範囲外になります。 M(5,5) i = 4 j = 2 i + j> 5であるため、 –
ああ、 (4,0)までしか表示されません。しかし、ありがとう!私はこれを行う簡単な方法があることを知っていた、私のアルゴリズムは、ifsとwhiles、うつ病でいっぱいでした:) –
本当に、私は下部もそれを更新しました – fortran
これは素晴らしいです。ありがとうございました! [これはCoffee-Script/JSの同等物です](https://gist.github.com/293566e1eaeb278e1170#file-zigzagarray-コーヒー)誰でもキャンバスプロジェクトなどに必要なものです。 – RayViljoen