2014-09-11 74 views
2

我需要使用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()) 

創建以下圖形

enter image description here

過濾器基本上建立連接所有其他點的直線,但在我的情況下,它將一個粒子軌跡的最後一個點連接到以下軌跡中的第一個軌跡。

我想爲每個粒子創建一個不同的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

+0

你可以分享數據集嗎?這將很容易找到問題。謝謝。 – Utkarsh 2014-09-11 20:30:04

+0

添加了數據集鏈接...謝謝! – 2014-09-16 10:31:23

回答

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。雖然這不是導致此問題的原因,但如果在第二個for循環後面使用i,結果可能不是您所期望的結果。

+0

感謝Utkarsh,我的影子是一個轉錄錯字,它在我的代碼中是正確的(tuh!我感到尷尬!)...無論如何,我想我並沒有真正使SetId工作。你能否給我提供一些如何設置索引的例子? – 2014-09-21 09:02:19

+1

這是一個idlist http://www.vtk.org/doc/nightly/html/classvtkIdList.html。對於'SetId'第一個值是index,第二個是形成該單元格的點的索引。 – Utkarsh 2014-09-22 13:30:23

+0

哦,我現在明白了。因此,如果我想將我的多段線的第二個點設置爲點列表中的第十個點,我必須將SetId(1,9)設置爲對吧? – 2014-09-22 16:24:12