代码之家  ›  专栏  ›  技术社区  ›  Juan Sebastian Totero

使用vtk创建给定一组点的多段线

  •  2
  • Juan Sebastian Totero  · 技术社区  · 10 年前

    我需要使用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,乍一看,我可以应用以下程序化过滤器

    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

    过滤器基本上创建了一条连接其他点的线,但在我的例子中,它将一个粒子轨迹的最后一点连接到以下轨迹的第一点。

    我想为每个粒子创建一个不同的多数据对象,这样我甚至可以单独标记或着色它们(并消除“所有连接”的问题)。我对类似过滤器的第一个猜测是

    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,我将得到与上面相同的图形。

    EDIT:可以找到数据集 here

    1 回复  |  直到 10 年前
        1
  •  3
  •   Utkarsh    10 年前

    问题在于迭代逻辑:

    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 循环,结果可能不是您所期望的。