我需要使用vtk和paraview在50個粒子的空間中顯示軌跡。目前我的數據是pos(x,y,t,n)
其中n是第n個粒子的標籤。我救了我的VTK文件的所有數據被組織爲:使用vtk創建多個多段線給定一組點使用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())
創建以下圖形
過濾器基本上建立連接所有其他點的直線,但在我的情況下,它將一個粒子軌跡的最後一個點連接到以下軌跡中的第一個軌跡。
我想爲每個粒子創建一個不同的polydata對象,所以我甚至可以單獨標記或着色它們(並消除「全連接」問題)。我的第一個猜測類似的過濾器將是
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())
但是,當我運行這個,ParaView只是由於segfault關閉。獎勵:代碼寫入正確:如果我將nParts設置爲1,則獲得與上面相同的圖形。
編輯:數據集可以發現here
你可以分享數據集嗎?這將很容易找到問題。謝謝。 – Utkarsh 2014-09-11 20:30:04
添加了數據集鏈接...謝謝! – 2014-09-16 10:31:23