2 次元データのコンター表示2009年12月23日 | |
はじめにCSV 形式の 2 次元データ列を ParaView でコンター表示する試み。 バージョンParaView 3.6.1 データの形式対象とする 2 次元データは CSV 形式とし、X 座標, Y 座標, 値の 3 つの項目をもつものとする。1 行目は項目のタイトルを書くものとする。 x,y,value -12,-12,-0.056149116 -12,-11.52,-0.04806925 -12,-11.04,-0.034522447 ... ここでは、サンプルとしてつぎのデータを使う。 value = sin(sqrt(x^2 + y^2))/sqrt(x^2 + y^2) ただし、x = 0 かつ y = 0 のとき value = 1 データは Excel で作成した。 CSV ファイルから VTK ファイルへ変換CSV ファイルから VTK ファイルへ変換するプログラムを用意する。 Python による例: csvToVtk.py (Python 2.6 で作成) # csvToVtk import sys import os def main(): if len(sys.argv) < 2: print "csvToVtk <csv file>" sys.exit() # input filename = sys.argv[1] file = open(filename, "r") file.readline() x = [] y = [] value = [] for line0 in file: line = line0[0:len(line0)-1] item = line.split(",") x.append(item[0]) y.append(item[1]) value.append(item[2]) file.close() # output basename = os.path.splitext(filename)[0] file = open(basename + ".vtk", "w") file.write("# vtk DataFile Version 2.0\n") file.write(basename + "\n") file.write("ASCII\n") file.write("DATASET UNSTRUCTURED_GRID\n") file.write("POINTS %d float\n" % len(x)) num = len(x) for i in range(0, num): file.write(x[i] + " " + y[i] + " 0\n") file.write("CELLS %d %d\n" % (num, 2*num)) for i in range(0, num): file.write("1 %d\n" % i) file.write("CELL_TYPES %d\n" % num) for i in range(0, num): file.write("1\n") file.write("POINT_DATA %d\n" % num) file.write("SCALARS point_scalars float\n") file.write("LOOKUP_TABLE default\n") for i in range(0, num): file.write(value[i] + "\n") file.close() if __name__ == "__main__": main() (2019.3.7 追記) Python 3 版 # csvToVtk import sys import os def main(): if len(sys.argv) < 2: print("csvToVtk <csv file>") sys.exit() # input filename = sys.argv[1] with open(filename, "r") as f: f.readline() x = [] y = [] value = [] for line0 in f: line = line0[0:len(line0)-1] item = line.split(",") x.append(item[0]) y.append(item[1]) value.append(item[2]) # output basename = os.path.splitext(filename)[0] with open(basename + ".vtk", "w") as f: f.write("# vtk DataFile Version 2.0\n") f.write(basename + "\n") f.write("ASCII\n") f.write("DATASET UNSTRUCTURED_GRID\n") f.write("POINTS %d float\n" % len(x)) num = len(x) for i in range(0, num): f.write(x[i] + " " + y[i] + " 0\n") f.write("CELLS %d %d\n" % (num, 2*num)) for i in range(0, num): f.write("1 %d\n" % i) f.write("CELL_TYPES %d\n" % num) for i in range(0, num): f.write("1\n") f.write("POINT_DATA %d\n" % num) f.write("SCALARS point_scalars float\n") f.write("LOOKUP_TABLE default\n") for i in range(0, num): f.write(value[i] + "\n") if __name__ == "__main__": main() コンター表示CSV ファイルを用意: contour.csv。これは格子状に並んだ点のデータである。これを上で用意したプログラムで VTK ファイルに変換する。以下は Windows のコマンドプロンプトでの例。 > csvToVtk.py contour.csv VTK ファイル "contour.vtk" ができるはず。それを ParaView で開く。 CSV ファイルから変換した VTK ファイルは、点データで構成されている。連続データとして表示するためにデローニー分割を行う。メニュー Filters の Delaunay 2D を適用。はしっこが欠けるので、Offset を 1.5 くらいにして対処。カラーバーを表示して、コンター図のできあがり。 ![]() せっかくなので、3 次元表示に挑戦。上のデータにさらに Filters の Wrap By Scalar を適用。もりあがる。 ![]() 格子状に並んだデータならよいが、ランダムに配置された点のデータであったらどうなるか (contour_random.csv)。これを VTK ファイルに変換して ParaView で開き、Delaunay 2D を適用。 ![]() ちょっと分割が粗いような気がするので、これを細分割する。上のデータに Filters の Loop Subdivision を適用する。 ![]() 上 2 つにそれぞれ Wrap By Scalar を適用し、両者を比べてみよう。 ![]() 上が細分割前、下が細分割後である。表面がなめらかになっている。 | |
PENGUINITIS |