C- Индексирование координат x, y, z в массиве байтов 1D - PullRequest
3 голосов
/ 21 февраля 2012

Я хочу оценить значения поверхности для реализации алгоритма марширующего тетраэдра, но я не понимаю, как работать с неформатированными данными .raw.

После загрузки файла .raw с набором данных тома в одномерный байтовый массив какое арифметическое преобразование следует применить, чтобы получить из него значение, связанное с X, Y, Z?Это единственный известный мне способ загрузки файлов .raw. Могу ли я создать вместо этого трехмерный байтовый массив?Как?

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);

1 Ответ

5 голосов
/ 21 февраля 2012

То, как вы индексировали бы данные в (x, y, z):

pVolume[((x * 256) + y) * 256 + z]

За кадром, это то, что компилятор C делает для вас, если вы пишете:

GLuByte array[256][256][256];

array[x][y][z]

Это работает только потому, что C индексирует от 0;если язык индексируется из 1, вам придется пересмотреть вычисление, чтобы получить чистый результат, полученный путем вычитания одного из каждого из x, y и z перед выполнением индексации.


Вспомогательный вопрос

Можете ли вы обобщить формулу для произвольных измерений?

Дано (где числовые значения на самом деле не имеют значения):

DIMx = 256
DIMy = 128
DIMz =  64

данные в(x, y, z) в массиве 1D pData находится по адресу:

pData[((x * DIMx) + y) * DIMy + z]

Значение DIMz служит главным образом для проверки: 0 <= z < DIMz (с использованием математической, а не C-нотации) и параллельно0 <= x < DIMx; 0 <= y <= DIMy.Обозначение C для z равно 0 <= z && z < DIMz;повторите mutatis mutandis для x и y.

...