图形处理之曲率计算vtkCurvatures

基本概念

        曲率是曲面弯曲程度的一种度量,是几何体的一种重要的局部特征。如下图所示,要计算曲面上给定点M的曲率,考虑经过M的法线的一个平面与曲面相交,得到一条二维曲线,称之为曲面在M点的一条法截线,如下图中所示的C法;经过M点法向量的曲面可以任意旋转,即可得到任意多条法截线,每条法截线会对应一个曲率,取具有最大曲率和最小曲率的两条法截线作为主法截线,如下图中C1和C2所示,其对应的曲率为k1和k2,称为主曲率;高斯曲率等于主曲率的乘积,即k1xk2;平均曲率等于主曲率k1和k2的平均值,即(k1+k2)/2。以上只是曲率的直观几何解释。
在这里插入图片描述

示例演示

        VTK中的vtkCurvatures类实现了四种计算网格模型点曲率的计算方法,四种曲率包括最小曲率、最大曲率、高斯曲率和平均曲率。

curvaturesFilter->SetCurvatureTypeToMinimum();
curvaturesfilter->SetCurvatureTypeToMaximum();
curvaturesFilter->SetCurvatureTypeToGaussian();
curvaturesFilter->SetCurvatureTypeToMean();

        该类接受一个vtkPolyData数据,将计算得到的曲率数据作为网格模型的点的属性数据存入返回的vtkPolyData中。这里简单给出高斯曲率的原理,如下图:
在这里插入图片描述

/**********************************************************************

Copyright (c) Mr.Bin. All rights reserved.
For more information visit: http://blog.csdn.net/webzhuce

**********************************************************************/
#include <vtkSmartPointer.h>
#include <vtkCurvatures.h>
#include <vtkPolyDataReader.h>
#include <vtkLookupTable.h>
#include <vtkColorTransferFunction.h>
#include <vtkColorSeries.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkScalarBarActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>

//test data : ../data/fran_cut.vtk
int main(int argc, char *argv[])
{
	vtkNew<vtkPolyDataReader> reader;
	reader->SetFileName("E:/github/Study-VTK/data/fran_cut.vtk");
	reader->Update();

	vtkNew<vtkCurvatures> curvaturesfilter;
	curvaturesfilter->SetInputConnection(reader->GetOutputPort());
	//curvaturesFilter->SetCurvatureTypeToMinimum();
	curvaturesfilter->SetCurvatureTypeToMaximum();
	//curvaturesFilter->SetCurvatureTypeToGaussian();
	//curvaturesFilter->SetCurvatureTypeToMean();
	curvaturesfilter->Update();

	double scalarrange[2];
	curvaturesfilter->GetOutput()->GetScalarRange(scalarrange);
	vtkNew<vtkLookupTable> lut;
	lut->SetHueRange(0.0,0.6);
	lut->SetAlphaRange(1.0,1.0);
	lut->SetValueRange(1.0,1.0);
	lut->SetSaturationRange(1.0,1.0);
	lut->SetNumberOfTableValues(256);
	lut->SetRange(scalarrange);
	lut->Build();

	vtkNew<vtkPolyDataMapper> mapper;
	mapper->SetInputConnection(curvaturesfilter->GetOutputPort());
	mapper->SetLookupTable(lut);
	mapper->SetScalarRange(scalarrange);
	vtkNew<vtkActor> actor;
	actor->SetMapper(mapper);
	vtkNew<vtkScalarBarActor> scalarbar;
	scalarbar->SetLookupTable(mapper->GetLookupTable());
	scalarbar->SetTitle(curvaturesfilter->GetOutput()->GetPointData()->GetScalars()->GetName());
	scalarbar->SetNumberOfLabels(5);
	vtkNew<vtkRenderer> renderer;
	renderer->AddActor(actor);
	renderer->AddActor2D(scalarbar);
	renderer->SetBackground(1.0, 1.0, 1.0);
	vtkNew<vtkRenderWindow> renderwindow;
	renderwindow->AddRenderer(renderer);
	renderwindow->SetSize(640, 480);
	renderwindow->Render();
	renderwindow->SetWindowName("PolyDataCurvature");
	vtkNew<vtkRenderWindowInteractor> renderwindowinteractor;
	renderwindowinteractor->SetRenderWindow(renderwindow);
	renderwindow->Render();
	renderwindowinteractor->Start();

	return EXIT_SUCCESS;
}

运行结果

在这里插入图片描述

参考资料

  • VTK图形图像开发进阶[M]
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值