2

vtk と paraview を使用して、50 個の粒子の空間に軌跡を表示する必要があります。現在、私のデータはpos(x,y,t,n)、n が n 番目の粒子のラベルです。次のように編成された vtk ファイルにすべてのデータを保存しました。

# vtk DataFile Version 3.0
VTK from Matlab
BINARY

DATASET POLYDATA
POINTS 199250 double
[PROPERLY ORGANIZED BINARY COORDINATES OF THE 199250 POINTS]

上記のファイルは ParaView に正しくインポートできます。一見すると、次の programmagle フィルターを適用できます。

pdi = self.GetPolyDataInput()
pdo =  self.GetPolyDataOutput()
newPoints = vtk.vtkPoints()
numPoints = pdi.GetNumberOfPoints()

for i in range(0, numPoints):
    coord = pdi.GetPoint(i)
    x, y, z = coord[:3]
    x = x * 0.03
    y = y * 0.03
    z = z * 2
    newPoints.InsertPoint(i, x, y, z)

pdo.SetPoints(newPoints)
aPolyLine = vtk.vtkPolyLine()
aPolyLine.GetPointIds().SetNumberOfIds(numPoints)

for i in range(0,numPoints):
 aPolyLine.GetPointIds().SetId(i, i)

pdo.Allocate(1, 1)
pdo.InsertNextCell(aPolyLine.GetCellType(), aPolyLine.GetPointIds())

次のグラフィックを作成するには

ここに画像の説明を入力

フィルターは基本的に、1 つおきのポイントを結ぶ線を作成しますが、私の場合は、1 つの粒子軌跡の最後のポイントを次の軌跡の最初のポイントに接続します。

パーティクルごとに異なるポリデータ オブジェクトを作成したいので、それらに個別にラベルを付けたり、色を付けたりすることもできます (そして、「すべてが接続されている」問題を排除できます)。同様のフィルターに対する私の最初の推測は

pdi = self.GetPolyDataInput()
pdo =  self.GetPolyDataOutput()
nParts = 50
newPoints = vtk.vtkPoints()
numPoints = pdi.GetNumberOfPoints()
numPointsPart = int(numPoints/nParts)

for i in range(0, numPoints):
    coord = pdi.GetPoint(i)
    x, y, z = coord[:3]
    x = x * 0.03
    y = y * 0.03
    z = z * 2
    newPoints.InsertPoint(i, x, y, z)

pdo.SetPoints(newPoints)
pdo.Allocate(nParts, 1)

for i in range(0,nParts):
  aPolyLine = vtk.vtkPolyLine()
  aPolyLine.GetPointIds().SetNumberOfIds(numPointsPart)
  indStart=int(i*numPointsPart)
  indEnd=int((i+1)*numPointsPart)
  for i in range(indStart,indEnd):
    aPolyLine.GetPointIds().SetId(i, i)
  pdo.InsertNextCell(aPolyLine.GetCellType(), aPolyLine.GetPointIds())

しかし、これを実行すると、segfault が原因で ParaView が閉じてしまいます。おまけ: コードは正しく書かれています。nParts を 1 に設定すると、上記と同じグラフが得られます。

編集:データセットはここにあります

4

1 に答える 1

3

問題は反復ロジックにあります。

for i in range(indStart, indEnd):
    aPolyLine.GetPointIds().SetId(i, i)

次のように変更する必要があります。

for i in range(indStart, indEnd):
    aPolyLine.GetPointIds().SetId(i - indStart, i)

SetId元のコードは、不適切なインデックスで呼び出していました。また、シャドウ変数に注意してくださいi。それが問題の原因ではありませんがi、2 番目のループの後に使用するforと、期待した結果が得られない可能性があります。

于 2014-09-16T15:06:46.267 に答える