2013-02-13 34 views
1

我需要的數據結構,用於在均勻採樣的3D網格存儲浮點值:自適應「均勻」網格的數據結構和算法?

X = X0 + IX * DX其中0 < = IX < NX

Y = Y0 + IY * DY其中0 < = IY <紐約

Z = Z0 + IZ * DZ其中0 < = IZ < NZ

到現在爲止我已經用我的Array類:

Array3D<float> A(nx, ny,nz); 
A(0,0,0) = 0.0f; // ix = iy = iz = 0 

它在內部將float值存儲爲具有nx * ny * nz個元素的1D數組。

但是現在我需要表示一個具有比我有更多數值的網格,例如 nx = ny = nz = 2000.

我認爲這樣一個網格中的很多鄰居節點可能有相似的值,所以我想如果有一些簡單的方法可以自適應地「粗化」網格。例如,如果該網格中的單元格的8個(ix,iy,iz)節點的值相距小於5%,則該網格中的單元格的8個節點(ix,iy,它們被「移除」並被一個值取代; 8個值的平均值。

我該如何以簡單高效的方式實現這樣的數據結構?編輯: 謝謝Ante建議有損壓縮。我想這可能是工作方式如下:

#define BLOCK_SIZE 64 
struct CompressedArray3D { 
    CompressedArray3D(int ni, int nj, int nk) { 
     NI = ni/BLOCK_SIZE + 1; 
     NJ = nj/BLOCK_SIZE + 1; 
     NK = nk/BLOCK_SIZE + 1; 

     blocks = new float*[NI*NJ*NK]; 
     compressedSize = new unsigned int[NI*NJ*NK]; 
    } 

    void setBlock(int I, int J, int K, float values[BLOCK_SIZE][BLOCK_SIZE][BLOCK_SIZE]) { 
     unsigned int csize; 
     blocks[I*NJ*NK + J*NK + K] = compress(values, csize); 
     compressedSize[I*NJ*NK + J*NK + K] = csize; 
    } 

    float getValue(int i, int j, int k) { 
     int I = i/BLOCK_SIZE; 
     int J = j/BLOCK_SIZE; 
     int K = k/BLOCK_SIZE; 

     int ii = i - I*BLOCK_SIZE; 
     int jj = j - J*BLOCK_SIZE; 
     int kk = k - K*BLOCK_SIZE; 

     float *compressedBlock = blocks[I*NJ*NK + J*NK + K]; 
     unsigned int csize = compressedSize[I*NJ*NK + J*NK + K]; 

     float values[BLOCK_SIZE][BLOCK_SIZE][BLOCK_SIZE]; 
     decompress(compressedBlock, csize, values); 
     return values[ii][jj][kk]; 
    } 

    // number of blocks: 
    int NI, NJ, NK; 

    // number of samples: 
    int ni, nj, nk; 

    float** blocks; 
    unsigned int* compressedSize; 
}; 

對於這是我需要一種有損壓縮是有用的:

  • 速度極快,還對小數據集(如64x64x64)
  • 壓縮很難> 3倍,不用擔心它是否會泄漏一些信息。

任何好的應聘者?

+1

聽起來像3D數據的有損壓縮。也許圖層可以視爲圖像並獨立壓縮(例如jpg),甚至可以將一個座標視爲時間並將數據視爲視頻。我不確定,但可能這些方法在查詢數據方面效率不高,因爲我認爲它們不適用於本地。 – Ante 2013-02-14 08:59:41

+0

相似主題:http:// arxiv。組織/ ABS/1303.0270 – Ante 2013-03-04 08:22:57

回答

0

我建議使用OctoMap來處理大型3D數據。 並將其擴展爲here以處理幾何屬性。