2012-02-21 4 views
0

As in my previous question, я работаю, загружая 1-мерный массив с объемными данными файла .raw. Ответ Джонатана Леффлера оказался полезным, но теперь я работаю с объемным набором данных разных размеров (X, Y, Z не совпадают). How would the formula be generalized?Индексирование нерегулярной сетки X, Y, Z координат в 1D-массиве

pVolume[((x * 256) + y) * 256 + z] // works when all dims are 256 


int XDIM=256, YDIM=256, ZDIM=256; // I want this sizes to be arbitrary 
const int size = XDIM*YDIM*ZDIM; 
bool LoadVolumeFromFile(const char* fileName) { 

    FILE *pFile = fopen(fileName,"rb"); 
    if(NULL == pFile) { 
    return false; 
    } 

    GLubyte* pVolume=new GLubyte[size]; //<- here pVolume is a 1D byte array 
    fread(pVolume,sizeof(GLubyte),size,pFile); 
    fclose(pFile); 

ответ

2

Доступ в махов следует простой принцип:

A[i][j][k] = B[k + j * Dim3 + i * Dim3 * Dim2]; 

// k = 1..Dim3, (or 0 <= k < Dim3, as one does in C) 
// j = 1..Dim2, 
// i = 1..Dim1. 

Здесь B является 1D массив размера Dim1 * Dim2 * Dim3. Формула, очевидно, обобщается на произвольно многие измерения. Если вы хотите мнемонику, запустите сумму с поставленным индексом, и в каждом слагаемом вы умножаетесь дальше по размеру предыдущего измерения.

Смежные вопросы