
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()
コンター表示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 Yuu Kasuga | |