Я пытаюсь получить определенный элемент внутри вектора.
Например,
Допустим, у меня есть вектор.
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++;
}
Как рассчитать идентификатор элемента выше (ну технически перед этим идентификатором) внутри вектора на основе текущего элемента, на котором я нахожусь.
Иллюстрация:
скажем, у меня есть матрица 5х5,
Допустим, мой текущий идентификатор — 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
Теперь я хочу идентификатор элемента в векторе, который находится прямо над мной, который представляет собой идентификатор 3, номер первой строки 3. И это просто предполагает, что MAP_WIDTH = 5 и MAP_HEIGHT = 5.
8 - 5 = 3
Текущий — MAP_WIDTH
= Выше
Вы можете легко определить (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;
Кажется, вы хотите отобразить линейный и двумерный индексы. Это довольно просто.
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; }
Таким образом, в вашем примере идентификатор элемента выше (X, Y) будет rect2lin (MAP_WIDTH, X, Y-1), который просто (Y-1) * MAP_WIDTH + X. Это прямо обобщает большее число измерений. Например, i = (z * h + y) * w + x для 3d и так далее.