技术概要:
1.通过小球画刷改变模型cell 标量。
2.利用非结构化网格的标量裁剪 vtkTableBasedClipDataSet 裁剪 结构化三角网格模型。
3.提取裁剪边缘实现轮廓光滑
1.在交互时绘制画刷小球。
小球的作用:获取在小球内部的模型点,以此改变该点周围Cell 的标量值
同事标量值通过 vtkLookupTable 改变了拾取的颜色
2.vtkTableBasedClipDataSet 裁剪
注意:clipper.SetValue(1.5); 这里的值必须在 选中 和 非选中的标量值之间。最好是中值
现在得到的是 非结构化的网格 vtkUnstructuredGrid 需要转换为 三角结构化网格
先进行非结构的三角化做准备,对应了结构化的拓扑结构。
非结构转换为结构化网格
我这里不知道为什么有点问题,没有 continue,但是模型没有完全结构化,存在少部分为未转化的点,线结构
得到polyData后 直接四件套安排:
vtkPolyDataNormals,vtkTriangleFilter,vtkCleanPolyData,vtkSmoothPolyDataFilter
3.边缘光滑(我这里讲大概)
算法原理:
改变模型边缘角度小于120度(视情况而定)
①可能绘制的区域不是是多个区域 用 vtkConnectivityFilter等等,提取每一个连通域。
②对每一个连通域提取边缘 vtkFeatureEdges
注意:这里提取的边缘的 vtkPoints 的点是乱序的,用vtkStripper 去转换为线模型,点就排好。
然后 对vtkStripper 做一次 vtkCleanPolyData避免重复点影响后面操作,得到了 linePolyData 。
③迭代以下操作(迭代操作,一般10次差不多,看情况)
用键值对的键存 linePolyData 的原始点,值存linePolyData 小于120度去调整的点。
开始循环linePolyData的每个点,判断三个点构成的角度是否是小于120度。然后移动这个中间点,改变后点的坐标 到键值对。(这个调整点的方法按照 和向量 移动就可以了)
等所有迭代结束后,然后改变模型坐标:
利用存起来的键点,找到对应的 点Id。
int pid = (int)surfaceData.FindPoint(a, b, c);
polyData.GetPoints().SetPoint(pid ,x,y,z);
到此边缘光滑结束。