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 を適用し、両者を比べてみよう。

上が細分割前、下が細分割後である。表面がなめらかになっている。