1

ベクトル内の特定の要素を取得しようとしています。例えば、

ベクトルがあるとしましょう。

std::vector<Tile> TileList;

ベクトルのサイズはMAP_HEIGHT=30、MAP_WIDTH = 200であるため、合計サイズはMAP_HEIGHT * MAP_WIDTH = 6000です。二重にネストされたforループを使用して、タイルでいっぱいのベクトルを繰り返し作成します。

for(int Y = 0; Y < MAP_HEIGHT; Y++)
{
   for(int X = 0; X < MAP_WIDTH; X++)
   {
        Tile TempTile;

        fscanf(FileHandle, "%d:%d ", &TempTile.TileID, &TempTile.TypeID);

        TileList.push_back(TempTile);

   }

}

今私の質問は私が繰り返すと言うことができます

int ID = 0;

for(int Y = 0; Y < MAP_HEIGHT; Y++)
{
   for(int X = 0; X < MAP_WIDTH; X++)
   {
        TileList[ID].do stuff with it

        //Check for the tile above this tile
        // Find a way to calculate the ID of the tile above this tile
        int IDoftilabove = ID - do something;
        if(TileList[IDoftilabove].variable == TILE_SOMETHING)
        {
           do stuff
        }
       ID++;
    }

現在の要素に基づいて、ベクトル内の上の要素のID(技術的にはこのIDのかなり前)を計算するにはどうすればよいですか。

イラスト:マトリックス5x5があるとします。現在のIDが8であるとしましょう。したがって、2番目の行番号3にいます。

1  2 *3* 4  5
1  2 (3) 4  5
1  2  3  4  5
1  2  3  4  5
1  2  3  4  5

ここで、ID 3、最初の行番号3である、私の真上にあるベクトル内の要素のIDが必要です。これは、MAP_WIDTH=5およびMAP_HEIGHT=5を想定しているだけです。

4

3 に答える 3

2

8 - 5 = 3

現在- MAP_WIDTH=上

于 2012-10-28T20:22:28.390 に答える
0

線形インデックスと2Dインデックスの間でマッピングしたいようです。これは非常に簡単です。

   int rect2lin(int w, int x, int y) { return y*w+x; }
   void lin2rect(int w, int i, int * x, int * y) { *y = i/w; *x = i%w; }

したがって、この例では、上記の要素のID(X、Y)はrect2lin(MAP_WIDTH、X、Y-1)であり、これは単純に(Y-1)* MAP_WIDTH+Xです。これは、より多くの次元に直接一般化されます。たとえば、3dの場合はi =(z * h + y)* w+xなどです。

于 2012-10-28T20:30:19.130 に答える
0

(row,col)与えられた座標を簡単に決定できますID

row = ID / MAP_WIDTH;
col = ID % MAP_WIDTH;

上記の要素からの座標が何であるかを知りたい場合:

row--;
ID_above = row * MAP_WIDTH + col;

以下の要素が何であるかを知りたい場合も同じことが当てはまります。

row++;
ID_below = row * MAP_WIDTH + col;
于 2012-10-28T20:26:35.103 に答える