系统: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]。
参考资料
[3]VTK-users-How to measure the volume from the many objects separated