从vtkPoints中删除单个点

时间:2011-07-29 19:47:20

标签: vtk

我有一个关于名为vtkPoints的VTK类的问题。该类具有插入单个点的功能,但没有删除单个点的功能。对于需要通过调用vtkPoints :: Modified()再次驱动图形管道来更新/重新呈现视图来更新视图的情况,这是不方便的。重新初始化vtkPoints,再次添加所有点以及更新/重新渲染视图的明显情况是太慢且资源密集。

这个问题有可能解决吗?

谢谢, timecatcher

5 个答案:

答案 0 :(得分:2)

示例http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/DeletePoint有一个相当简单的解决方案。通过过滤要移除的ID将点复制到另一个临时vtkPoints,并将其浅拷贝到原始的:

void ReallyDeletePoint(vtkSmartPointer<vtkPoints> points, vtkIdType id)
{
  vtkSmartPointer<vtkPoints> newPoints = 
    vtkSmartPointer<vtkPoints>::New();

  for(vtkIdType i = 0; i < points->GetNumberOfPoints(); i++)
    {
    if(i != id)
      {
      double p[3];
      points->GetPoint(i,p);
      newPoints->InsertNextPoint(p);
      }
    }

  points->ShallowCopy(newPoints);
}

答案 1 :(得分:1)

无法从vtkPoints中删除单个点。根据您的问题,这里有一些潜在的解决方案:

  1. 将所有点存储在单个vtkPoint实例中,使用值替换要删除的点以替换它。这对于限制点云可以使用的最大内存量非常有用。
  2. 将所有点存储在单个vtkPoint实例中,使用远离场景的值覆盖您想要删除的点。
  3. 为每个点创建一个vtkPoint,vtkCellArray和vtkPolyData,使用vtkAppendPolyData将它们连接在一起。这有一个RemoveInput(vtkPolyData *),因此您可以删除单个点。

答案 2 :(得分:0)

否:它与float []数组具有相同的可变性限制。删除点的唯一方法是复制和排除。请注意,如果超出预先分配的存储空间,则在执行Insert()操作时会产生相同的复制惩罚。

其他相关的数据结构选项包括vtkCollection和vtkPolyData。此外,查看一些PolyData剪辑过滤器的源代码可能会提供信息,以了解这些类型的操作在内部实现的方式 - 这些操作应该尽可能快地在数据结构的限制范围内

答案 3 :(得分:0)

允许从vtkPoints中删除一个点会导致使用该点的数据集被破坏。您还必须删除使用该点的所有单元格以及缩小点数据数组。

我建议如果你有一个创建vtkPoints的过滤器来修改vtkPoints对象以及依赖于RequestData()方法中的任何东西。

答案 4 :(得分:0)

这是一种在python中从vtkPoints中删除一个点的方法。

def deletePoint(vtk_points, *args):
    if isinstance(args[0], list):
        args = args[0]

    points = vtk.vtkPoints()
    for i in range(vtk_points.GetNumberOfPoints()):
        if i in args: continue
        p = vtk_points.GetPoint(i)
        points.InsertNextPoint(p)
    return points