3

マーチング四面体アルゴリズムを実装するためにサーフェスの値を評価したいのですが、.rawのフォーマットされていないデータを処理する方法がわかりません。

ボリュームデータセットを含む.rawファイルを1Dバイト配列にロードした後、そこからX、Y、Zに関連付けられた値を取得するには、どの算術変換を適用する必要がありますか?これは、.rawファイルをロードするために私が知っている唯一の方法です。これの代わりに3Dバイト配列を作成できますか?どのように?

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

1 に答える 1

5

(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のそれぞれから1を引くことによって得られる最終結果を達成するために、計算を修正する必要があります。


補助的な質問

任意の次元の式を一般化できますか?

与えられた(数値が実際には重要ではない場合):

DIMx = 256
DIMy = 128
DIMz =  64

1D配列の(x、y、z)のデータは、次のpData場所にあります。

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

DIMzの値は、主に検証に役立ちます:( 0 <= z < DIMzC表記ではなく数学表記を使用)、および並行して0 <= x < DIMx; 0 <= y <= DIMy。のC表記z0 <= z && z < DIMz;です。とを準用しますxy

于 2012-02-21T02:56:55.293 に答える