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。所以我在第二行第 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,即 ID 3,第一行号 3。这只是假设 MAP_WIDTH = 5 和 MAP_HEIGHT = 5。

4

3 回答 3

2

8 - 5 = 3

当前 - MAP_WIDTH= 以上

于 2012-10-28T20:22:28.390 回答
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 回答
0

似乎您想在线性索引和二维索引之间进行映射。这很简单。

   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 回答