系统:Win8.1
VTK:6.2.0
Qt:5.2.1
在VTK中计算体积和面积的主要类为vtkMassProperties。不管是是网上还是VTK源码,都缺乏完整的实例,在此将分享一些简单的实例。
1 结构化对象——圆
1.1 代码
vtkSmartPointer< vtkSphereSource > sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->SetRadius( 100 ); sphereSource->SetPhiResolution( 21 ); sphereSource->SetThetaResolution( 41 ); sphereSource->Update(); vtkSmartPointer< vtkTriangleFilter > triangleFilter= vtkSmartPointer< vtkTriangleFilter >::New(); triangleFilter->SetInputData( sphereSource->GetOutput() ); triangleFilter->Update(); vtkSmartPointer< vtkMassProperties > polygonProperties = vtkSmartPointer< vtkMassProperties >::New(); polygonProperties->SetInputData( triangleFilter->GetOutput()); polygonProperties->Update(); double area = polygonProperties->GetSurfaceArea(); double vol = polygonProperties->GetVolume(); qDebug() << "Data area is:" << QString::number(area) << "Data volume is: " << QString::number( vol );
1.2 结果分析
执行上述代码得到的球体表面和体积为:
Data area is: "125031" Data volume is: "4.14673e+06"
球体表面积和体积的公式,计算半径为100的球体的表面积和体积分别为125600和4.188e+06。
将上述值总结进下面的表格中
表面积 | 体积 | |
VTK测量值 | 125031 | 4.14673e+06 |
理论值 | 125600 | 4.188e+06 |
比率 | 0.9955 | 0.9901 |
1.3 可能遇到的问题
如果在计算表面积和体积之前sphereSource没有先Update(),将会提示如下错误:
ERROR: In E:\VTK\VTK-6.2.0\Filters\Core\vtkMassProperties.cxx, line 80 vtkMassProperties (0000006172894470): No data to measure...!解决方法:
sphereSource->Update();
2 非结构化对象
在三维重建之后(例如面绘制),希望能够测得重建对象的体积和表面积,这时候也可以通过vtkMassProperties来实现。下面是其主要代码:
if ( !m_pvtkTriangleFilter ) m_pvtkTriangleFilter = vtkTriangleFilter::New(); if ( m_pvtkContourFilter3D ) { m_pvtkTriangleFilter->SetInputData( m_pvtkContourFilter3D->GetOutput() ); } else if ( m_pvtkMarchingCubes ) { m_pvtkTriangleFilter->SetInputData( m_pvtkMarchingCubes->GetOutput() ); } m_pvtkTriangleFilter->Update(); if ( !m_pvtkMassProperties ) m_pvtkMassProperties = vtkMassProperties::New(); m_pvtkMassProperties->SetInputData( m_pvtkTriangleFilter->GetOutput()); m_pvtkMassProperties->Update(); double area = m_pvtkMassProperties->GetSurfaceArea(); double volume = m_pvtkMassProperties->GetVolume();
为了使得测量效果更加准确,可以使用vtkSmoothPolyDataFilter先对m_pvtkContourFilter3D和m_pvtkMarchingCubes进行平滑[2]。
参考资料
[1]vtk计算Polydata的面积和体积
[2]SmoothPolyDataFilter
[3]VTK-users-How to measure the volume from the many objects separated