我有一个关于名为 vtkPoints 的 VTK 类的问题。该类具有插入单个点的功能,但不具有删除单个点的功能。这对于需要通过调用 vtkPoints::Modified() 再次驱动图形管道来更新/重新渲染视图来更新视图的情况是不方便的。重新初始化 vtkPoints、再次添加所有点和更新/重新渲染视图的明显情况太慢且资源密集。
这个问题有可能的解决方案吗?
谢谢,计时员
我有一个关于名为 vtkPoints 的 VTK 类的问题。该类具有插入单个点的功能,但不具有删除单个点的功能。这对于需要通过调用 vtkPoints::Modified() 再次驱动图形管道来更新/重新渲染视图来更新视图的情况是不方便的。重新初始化 vtkPoints、再次添加所有点和更新/重新渲染视图的明显情况太慢且资源密集。
这个问题有可能的解决方案吗?
谢谢,计时员
示例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);
}
无法从 vtkPoints 中删除单个点。根据您的问题,这里有一些潜在的解决方案:
这是一种从 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
允许从 vtkPoints 中删除一个点会导致使用该点的数据集损坏。您还必须删除所有使用该点的单元格并缩小点数据数组。
我建议如果您有一个过滤器正在创建 vtkPoints 以修改 vtkPoints 对象以及任何依赖于 RequestData() 方法中的对象。
否:它对可变性的限制与 float[] 数组相同。删除点的唯一方法是复制和排除。请注意,如果您超出预分配的存储空间,则在执行 Insert() 操作时会产生相同的复制损失。
其他相关的数据结构选项包括 vtkCollection 和 vtkPolyData。此外,查看一些 PolyData 剪辑过滤器的来源可能会提供有用的信息,以了解这些类型的操作在内部实现的方式——这些操作应该在数据结构的限制范围内尽可能快.