我需要使用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())
创建以下图形
滤镜基本上会创建一条连接每个其他点的线,但在我的情况下,它会将一个粒子轨迹的最后一个点连接到下一个轨迹的第一个点。
我想为每个粒子创建一个不同的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只是因为段错误而关闭。额外:代码写得正确:如果我将nParts设置为1,我会得到与上面相同的图形。
编辑:可以找到数据集here
答案 0 :(得分: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
循环后使用for
,结果可能不是您所期望的。