2011-12-05 14 views
1

私はVTKを使って通常のグリッドに保存したデータを視覚化しようとしています(色付きの等値面を描く)。低解像度バージョンのデータで動作するvtkレガシーフォーマットでデータをダンプするコードを書きました。 ParaViewまたはVTKライブラリを使用して、期待される等値面を抽出して表示することができます。各次元で10倍に分解能を上げると(nxは約100から1000、ny、nzと同じです)、パラビューとVTKライブラリを使って書いたビューアは正しくありません。それらは、単一の「ブロブ」の代わりに、わずかに軸外のシートのセットのように見えます。私は他のテストから、データそのものが正しいことを知っています。vtkデータフォーマットエラー

レガシーvtk形式のダンプコードに何か問題がありますか?私はルックアップテーブルが何をしているのか理解していませんが、低解像度のケースでうまくいくようです。

std::ofstream out(filename); 

out << "# vtk DataFile Version 3.0" << std::endl; 
out << "Signed distance/biharmonic visualizer" << std::endl; 
out << "ASCII" << std::endl; 
out << "DATASET STRUCTURED_POINTS" << std::endl; 
out << "DIMENSIONS " << nx << " " << ny << " " << nz << std::endl; 
out << "ORIGIN 0 0 0" << std::endl; 
out << "SPACING " << h << " " << h << " " << h << std::endl; 
out << "POINT_DATA " << nx*ny*nz << std::endl; 
out << "SCALARS signedDistance double" << std::endl; 
out << "LOOKUP_TABLE default" << std::endl; 
for(size_t i = 0; i < nx; ++i) 
    for(size_t j = 0; j < ny; ++j) 
    for(size_t k = 0; k < nz; ++k) 
     out << tempPhi(i,j,k) << std::endl; 
out << "SCALARS biharmonic double" << std::endl; 
out << "LOOKUP_TABLE default" << std::endl; 
for(size_t i = 0; i < nx; ++i) 
    for(size_t j = 0; j < ny; ++j) 
    for(size_t k = 0; k < nz; ++k) 
     out << biharmonic(i,j,k) << std::endl; 
out.close(); 
+0

ここで何が間違っているのかわかりません - これはVTKファイルフォーマットの仕様に合ったファイルを出力するように見えますが(C++は実際にはわかりませんが) 1つのスカラ変数だけが出力された場合(より高い解像度で)、読者は機能しますか?実際の出力を見ることができるように、どこかにVTKファイルの例を投稿できますか? – Chris

+0

最初のフィールドを出力していても同じ問題です。完全なサンプルデータファイルはhttp://www.cs.utah.edu/~benjones/gridDump000008.vtkです。 また、isoサーフェスとそれが何であるべきかの写真があります:http://www.cs.utah.edu/~benjones/isoFail.png –

答えて

2

VTKファイルには、1.79769e+308という数のオカレンスがあります。実際にあなたのデータを見るには、これらを0に置き換えなければなりませんでした。これを実行してVisItのデータファイルを見たところ、ポイントデータを書き込む方法が間違っていると思います(3つのループ用にネストされています - データを3Dから1Dリストにフラット)。

あなたのVTKライターに小さなテストデータセットを書いてください。また、従来のVTKファイルを書き込むためにVisItに付属しているthisのシンプルなCコードもお勧めします。両方の方法で書かれたデータセットが正確に一致することを確認します(バージョン3を使用するのに対し、VisItWriterLib.cはバージョン2のVTKファイル形式を書き込みますが、問題はありません)。

編集:コメントで説明したように、問題はポイントデータを出力して3Dから1Dリストにフラット化するために使用されたネストされたforループの順序です。

for(size_t i = 0; i < nx; ++i) 
    for(size_t j = 0; j < ny; ++j) 
    for(size_t k = 0; k < nz; ++k) 
     out << tempPhi(i,j,k) << std::endl; 

は、実際には、すなわちデータ

for(size_t k = 0; k < nz; ++k) 
    for(size_t j = 0; j < ny; ++j) 
    for(size_t i = 0; i < nx; ++i) 
     out << tempPhi(i,j,k) << std::endl; 

を読むべきコードは、主要行ない、カラム主要な順序で書き込まなければなりません。これは、VTKファイル形式の書類が欠落している点です。

+0

私は0アイソサーフェイスしか気にしないので、大きな価値の問題?小さなデータセットがなぜ私に有益な結果をもたらすのか、大きなデータセットは得られないのですか?それが平らな問題だったら、それはどんな決断でも現れるだろうと私には思われます。 –

+0

@BenJones大きな値を削除するのは、データを表示するだけで、それがその値を支配していないことでした。これからは、データが「間違って」読み込まれているように見えます - VTKファイルの期待された形式ではありません。したがって、メソッドとVisItWriterLib.cのような、私たちが知っているメソッドでいくつかのテストデータを書くことをお勧めします。これは、出力ファイルの正しい形式を確認する簡単な方法です。 – Chris

+0

@BenJonesあなたのデータが低解像度ではあるが高解像度ではないように思われるという事実は、あなたのVTKライタールーチンがすべての解像度でフォーマットされたデータを間違って出力していることを示唆しています。ちょうど低解像度で大丈夫と思われる。私はちょうどあなたのネストされたループの順序を入れ替えることで推測しています( 'iと' k 'のインデックスを入れ替えて)、それが違いを生むかどうか確認してください。 – Chris