本来没有打算经营博客,但是无奈公司倒闭,所有人都被裁,现在工作难找,赋闲在家,看看能不能整理一下之前做过的功能来谋取一点点生活费,如果我的文章能帮助到各位,节省大家的时间和精力也是好的。废话不多说了,进入正文。
切割的种类
- 矩形切割
- 平面切割
- 曲线切割(本文主要是讲这个)
- 曲面切割(我其他的文章有这个介绍)
曲线切割
曲线切割可以切割体绘制,可以切割面绘制,两者切割的数据不一样,所以切割的算法也不一样,切割体绘制主要是对图像数据的处理,切割面绘制主要是对面片的处理,本文主要是讲解面绘制的切割,体绘制的切割可以看我其他的文章。
曲线切割的效果
看视频是不是自己想要的效果,需求确定了,功能完成才不会出错。
可以设置切割还是保留
主要代码
代码主要是Qt+VTK,主要的部分就是切割的部分:
思路是我们获取曲线内的所有点设置标量,以区分需要裁剪和不需要裁剪的部分,然后对标记好的数据进行过滤,我刚开始是打算进行布尔运算,但是更加复杂。
vtkSmartPointer<myVtkThreshold> selector =vtkSmartPointer<myVtkThreshold>::New();
vtkSmartPointer<vtkMaskFields> scalarsOff =vtkSmartPointer<vtkMaskFields>::New();
vtkSmartPointer<vtkGeometryFilter> geometry =vtkSmartPointer<vtkGeometryFilter>::New();
selector->SetInputData((vtkPolyData*)myPD);
selector->SetInputArrayToProcess(0, 0, 0,
vtkDataObject::FIELD_ASSOCIATION_CELLS,
vtkDataSetAttributes::SCALARS);
selector->SetAllScalars(1);
selector->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "Cuts");
selector->SetLowerThreshold(0.9);
selector->SetUpperThreshold(1.1);
selector->Update();
scalarsOff->SetInputData(selector->GetOutput());
scalarsOff->CopyAttributeOff(vtkMaskFields::POINT_DATA, vtkDataSetAttributes::SCALARS);
scalarsOff->CopyAttributeOff(vtkMaskFields::CELL_DATA, vtkDataSetAttributes::SCALARS);
scalarsOff->Update();
geometry->SetInputData(scalarsOff->GetOutput());
geometry->Update();
完整工程
为了避免伸手党只是张要代码,也是为了尊重自己的劳动成果,完整的工程需要支付一些费用,本工程只允许学习使用,不允许商业分享,还希望理解,支付并使用代码即认为接受。以下是完整工程连接,需要自己修改工程依赖,vtk使用的是8.2的版本。
暂时没有上传到优快云,不知道如何设置。
感兴趣的朋友点击拍下。