3

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

这个问题有可能的解决方案吗?

谢谢,计时员

4

5 回答 5

2

示例http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/DeletePoint有一个相当简单的解决方案。通过过滤要删除的 id 将点复制到另一个临时 vtkPoints,并将其浅复制到原始 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);
}
于 2017-05-23T08:25:34.143 回答
1

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

  1. 将所有点存储在一个 vtkPoint 实例中,用一个值覆盖要删除的点以替换它。这对于限制点云可以使用的最大内存量很有用。
  2. 将所有点存储在一个 vtkPoint 实例中,用一个远离场景的值覆盖您想要摆脱的点。
  3. 为每个点创建一个 vtkPoint、vtkCellArray 和 vtkPolyData,使用 vtkAppendPolyData 将它们连接在一起。这有一个 RemoveInput(vtkPolyData*) 所以你可以删除单个点。
于 2011-10-12T14:29:56.480 回答
1

这是一种从 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
于 2021-07-11T15:39:03.210 回答
0

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

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

于 2011-08-05T16:17:36.077 回答
0

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

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

于 2011-07-30T21:28:44.487 回答