создать несколько полилиний с заданным набором точек, используя vtk

Мне нужно отобразить траектории в пространстве 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, я получаю тот же график, что и выше.

РЕДАКТИРОВАТЬ: набор данных можно найти здесь


person Juan Sebastian Totero    schedule 11.09.2014    source источник
comment
Можете ли вы поделиться набором данных? Это значительно упростит отслеживание проблемы. Спасибо.   -  person Utkarsh    schedule 12.09.2014
comment
Добавил ссылку на набор данных... Спасибо!   -  person Juan Sebastian Totero    schedule 16.09.2014


Ответы (1)


Проблема в логике итерации:

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, результат может оказаться не таким, как вы ожидаете.

person Utkarsh    schedule 16.09.2014
comment
Спасибо, Уткарш, затененный i был опечаткой в ​​​​транскрипции, и это правильно в моем коде (тьфу! Мне неловко!) ... В любом случае, я думаю, что на самом деле у меня не работает SetId. Не могли бы вы предоставить мне пример того, как я должен установить индексы? - person Juan Sebastian Totero; 21.09.2014
comment
о, теперь я понимаю. Итак, если я хочу, чтобы вторая точка моей полилинии была десятой точкой в ​​​​списке точек, я должен правильно установить SetId (1,9)? - person Juan Sebastian Totero; 22.09.2014