Indicizzazione delle coordinate X, Y, Z della griglia irregolare in una matrice 1D
-
28-10-2019 - |
Domanda
Come nella mia domanda precedente , ioSto caricando un array 1D con dati volumetrici di un file .raw.La risposta di Jonathan Leffler si è rivelata utile, ma ora sto lavorando con un set di dati di volume di dimensioni diverse (X, Y, Z non sono le stesse).How would the formula be generalized?
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);
Soluzione
L'accesso graduale segue un semplice principio:
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.
Qui B
è un array 1D di dimensioni Dim1 * Dim2 * Dim3
.La formula ovviamente si generalizza a molte dimensioni arbitrariamente.Se vuoi un mnemonico, inizia la somma con l'indice a digiuno e in ogni somma moltiplichi ulteriormente per l'estensione della dimensione precedente.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow