Как массив вокселей разделить на части и получить одну из них по id?
Есть массив вокселей xyz 16^3 (voxel - это short, пока так))), массив заполнен случайными short
short voxels[16][16][16]
Что хочу сделать: Разделить массив voxels на чанки по 4 * 8 * 8, взять чанк по id и вернуть vector вокселей в этом чанке Для voxels[16][16][16] получилось бы 16 чанков по 4 * 8 * 8, один из этих чанков хочу получить по id и вернуть его воксели
Проблема с написанием этой функции: *В функции учитываю что voxels может быть разного размера и чанки могут быть разного размера
// voxel_size = 16
// world_length = voxel_size = 16
vector<short> get_voxels_from_chunk(short (*voxels)[voxel_size][voxel_size][voxel_size], int world_length, int chunk_size_x, int chunk_size_y, int chunk_size_z, int chunk_id) {
vector<short> result;
int x_offset; // смещение чанка по x
int y_offset; // смещение чанка по y
int z_offset; // смещение чанка по z
for (int i = x_offset; i < x_offset+chunk_size_x; i++){
for (int ii = y_offset; ii < y_offset+chunk_size_y; ii++){
for (int iii = z_offset; iii < y_offset+chunk_size_z; iii++){
result.push_back(*voxels[i][ii][iii]);
}
}
}
}
В чём именно проблема: Не могу посчитать offset, как мне его посчитать?
Если интересно для чего это всё: Хочу попробовать написать сжатие атрибутов вокселей, по плану: воксель - id в таблице с информацией о вокселе, поэтому это массив short (кстати до этого я не писал на с++)
Ответы (2 шт):
Ответ с другого форума от автора Taulan Khatuaev
*Немного изменил его ответ, потому что недостаточно объяснил что хотел
vector<short> get_voxels_from_chunk(
short (&voxels)[voxel_size][voxel_size][voxel_size], int world_length,
int chunk_size_x, int chunk_size_y, int chunk_size_z, int chunk_id
) {
vector<short> result;
int chunk_count_x = world_length / chunk_size_x;
int chunk_count_y = world_length / chunk_size_y;
int chunk_count_z = world_length / chunk_size_z;
int chunk_index_x = chunk_id % chunk_count_x;
int chunk_index_y = (chunk_id / chunk_count_x) % chunk_count_y;
int chunk_index_z = chunk_id / (chunk_count_x * chunk_count_y);
int x_offset = chunk_index_x * chunk_size_x;
int y_offset = chunk_index_y * chunk_size_y;
int z_offset = chunk_index_z * chunk_size_z;
for (int i = x_offset; i < x_offset + chunk_size_x; i++)
for (int ii = y_offset; ii < y_offset + chunk_size_y; ii++)
for (int iii = z_offset; iii < z_offset + chunk_size_z; iii++)
result.push_back(voxels[i][ii][iii]);
return result;
}