如何修改vtkPolyData中单元格内的点?第二种方法未达预期求助
解决VTK中通过Cell修改PolyData点无效的问题
我刚看到你遇到的这个问题——用GetCell获取单元格后修改点没效果,但直接用GetPoint/SetPoint就正常,这其实是VTK的设计逻辑导致的,我来给你拆解清楚:
问题根源
VTK里的vtkCell对象,它的GetPoint()方法返回的不是原始点数据的引用,而是一个临时拷贝的坐标值。你修改这个临时拷贝的内容,根本不会同步到vtkPolyData底层的vtkPoints数组里,自然看不到效果。
而直接调用vtkPolyData::SetPoint(),是直接操作它内部存储的点集合,修改的是原始数据源,所以能生效。
正确的修改方式
要通过单元格修改点,你需要先获取单元格内点的索引ID,再用这个ID去调用vtkPolyData的SetPoint()方法修改原始数据。
示例代码(修正后)
#include <iostream> #include <vtkCell.h> #include <vtkCellArray.h> #include <vtkFloatArray.h> #include <vtkPointData.h> #include <vtkPoints.h> #include <vtkPolyData.h> #include <vtkSmartPointer.h> int main() { // 创建一个简单的PolyData(比如一条线段) auto polyData = vtkSmartPointer<vtkPolyData>::New(); auto points = vtkSmartPointer<vtkPoints>::New(); points->InsertNextPoint(0.0, 0.0, 0.0); // 点ID 0 points->InsertNextPoint(1.0, 0.0, 0.0); // 点ID 1 polyData->SetPoints(points); auto cells = vtkSmartPointer<vtkCellArray>::New(); vtkIdType cellIds[2] = {0, 1}; cells->InsertNextCell(2, cellIds); polyData->SetLines(cells); // 方法1:直接修改点(有效) double pt1[3]; polyData->GetPoint(1, pt1); pt1[0] = 2.0; polyData->SetPoint(1, pt1); std::cout << "直接修改后点1的坐标:"; polyData->GetPoint(1, pt1); std::cout << pt1[0] << ", " << pt1[1] << ", " << pt1[2] << std::endl; // 方法2:通过Cell修改点(修正版,有效) vtkCell* cell = polyData->GetCell(0); // 获取单元格内第一个点的ID,而不是直接拿坐标 vtkIdType pointId = cell->GetPointId(0); double pt0[3]; polyData->GetPoint(pointId, pt0); pt0[0] = -1.0; // 用点ID调用SetPoint修改原始数据 polyData->SetPoint(pointId, pt0); std::cout << "通过Cell修改后点0的坐标:"; polyData->GetPoint(pointId, pt0); std::cout << pt0[0] << ", " << pt0[1] << ", " << pt0[2] << std::endl; return 0; }
关键总结
- 永远记住:
vtkCell::GetPoint()返回的是临时拷贝,不能用来修改原始点数据 - 如果要通过单元格修改点,必须用
vtkCell::GetPointId(int idx)获取点的索引,再通过vtkPolyData::SetPoint(id, coords)修改原始数据源 - 所有对vtkPolyData点的有效修改,最终都要落到它内部的
vtkPoints对象上
内容的提问来源于stack exchange,提问作者Romain Hernandez
相关产品推荐
相关产品推荐

