VTK体积&表面积测量

    系统: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测量值1250314.14673e+06
理论值1256004.188e+06
比率0.99550.9901
    由上表可知,VTK测量值是低于理论值的,但是都比较接近于理论值。

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

  • 1
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneSea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值