C- Indicizzazione X, Y, Z coordina in un array di byte 1D
-
28-10-2019 - |
Domanda
Voglio valutare i valori della superficie per implementare un algoritmo tetraedro in marcia, ma non capisco come lavorare con dati non formattati.
Dopo aver caricato un file .raw con un set di dati di volume in un array di byte 1D, quale trasformazione aritmetica dovrebbe essere applicata per ottenere il valore associato a x, y, z da esso? Questo è l'unico modo per caricare i file .raw, potrei creare un array di byte 3D invece di questo? Come?
int XDIM=256, YDIM=256, ZDIM=256;
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
Il modo in cui indicizzi il dato a (x, y, z) è:
pVolume[((x * 256) + y) * 256 + z]
Dietro le quinte, questo è ciò che il compilatore C fa per te se scrivi:
GLuByte array[256][256][256];
array[x][y][z]
Funziona solo quello semplicemente perché C indicizza da 0; Se il linguaggio indicizzato da 1, dovresti rivedere il calcolo per ottenere il risultato netto ottenuto sottraendo uno da ciascuno di X, Y e Z prima di fare l'indicizzazione.
Domanda ausiliaria
Puoi generalizzare la formula per le dimensioni arbitrarie?
Dato (dove i valori numerici non contano davvero):
DIMx = 256
DIMy = 128
DIMz = 64
il dato a (x, y, z) in un array 1d pData
si trova su:
pData[((x * DIMx) + y) * DIMy + z]
Il valore di Dimz serve principalmente per la convalida: 0 <= z < DIMz
(usando notazione matematica piuttosto che c) e in parallelo 0 <= x < DIMx; 0 <= y <= DIMy
. La notazione C per z
è 0 <= z && z < DIMz
; ripetere mutatis mutandis per x
e y
.