Мне нужно отобразить траектории в пространстве 50 частиц с помощью vtk и paraview. В настоящее время мои данные 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, и на первый взгляд я могу применить следующий программный фильтр.
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())
чтобы создать следующую графику
Фильтр в основном создает линию, соединяющую все остальные точки, но в моем случае он соединяет последнюю точку одной траектории частицы с первой следующей траектории.
Я хотел бы создать отдельный объект полиданных для каждой частицы, чтобы я мог даже пометить или покрасить их отдельно (и устранить проблему «всесвязности»). Мое первое предположение для подобного фильтра было бы
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, я получаю тот же график, что и выше.
РЕДАКТИРОВАТЬ: набор данных можно найти здесь