我有一个关于名为vtkPoints的VTK类的问题。该类具有插入单个点的功能,但没有删除单个点的功能。对于需要通过调用vtkPoints :: Modified()再次驱动图形管道来更新/重新呈现视图来更新视图的情况,这是不方便的。重新初始化vtkPoints,再次添加所有点以及更新/重新渲染视图的明显情况是太慢且资源密集。
这个问题有可能解决吗?
谢谢, timecatcher
答案 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中删除单个点。根据您的问题,这里有一些潜在的解决方案:
答案 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