基本概念
曲率是曲面弯曲程度的一种度量,是几何体的一种重要的局部特征。如下图所示,要计算曲面上给定点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]