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);
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top