项目下载链接:QT5.9.2+VTK8.0实现等高线绘制资源-CSDN文库
示例如下:
主要代码如下:
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkPolyDataMapper.h"
#include "vtkVolume16Reader.h"
#include "vtkActor.h"
#include "vtkOutlineFilter.h"
#include "vtkCamera.h"
#include "vtkProperty.h"
#include "vtkPolyDataNormals.h"
#include "vtkContourFilter.h"
#include "vtkFloatArray.h"
#include "vtkPointData.h"
#include "dataimport.h"
#include <vtkDataSetMapper.h>
#include <vtkDelaunay2D.h>
#include <vtkLookupTable.h>
#include <vtkScalarBarActor.h>
#include <vtkSmoothPolyDataFilter.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace std;
int main()
{
DataImport import;
QVector<point_3D> points;
QString PathName = "SrcData_Filtered.txt";
import.Data_ReadFromTXT(PathName, points);
//【导入数据】
vtkSmartPointer<vtkPoints> vtk_points =
vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray> cellArray = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkFloatArray> pointScalar = vtkSmartPointer<vtkFloatArray>::New();
for(unsigned int x=0; x<points.count(); x++)
{
vtk_points->InsertNextPoint(points.at(x).x_value, points.at(x).y_value,
points.at(x).z_value);
//每个坐标点都需要创建一个顶点Cell
cellArray->InsertNextCell(x);
//设置结点标量
pointScalar->InsertNextValue(points.at(x).z_value);
}
double rangeMin = pointScalar->GetRange()[0];
double rangeMax = pointScalar->GetRange()[1];
vtkSmartPointer<vtkPolyData> polydata =
vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(vtk_points);
//polydata->SetPolys(cellArray);//设置单元数据
polydata->GetPointData()->SetScalars(pointScalar);//设置点集标量
//表面重建方式1-vtkDelaunay2D
vtkSmartPointer<vtkDelaunay2D> delaunay =
vtkSmartPointer<vtkDelaunay2D>::New();
delaunay->SetInputData(polydata);
delaunay->Update();
//重建后进行拉普拉斯平滑
vtkSmartPointer<vtkSmoothPolyDataFilter> smoothFilter =
vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
smoothFilter->SetInputConnection(delaunay->GetOutputPort());
smoothFilter->SetBoundarySmoothing(true);//控制是否对边界点平滑
smoothFilter->SetFeatureEdgeSmoothing(true);//控制是否对特征边上的点的平滑,设为false会更平滑
smoothFilter->SetNumberOfIterations(200);//平滑次数,越大越平滑
smoothFilter->Update();
// 获取等值面
vtkContourFilter *skinExtractor = vtkContourFilter::New();
//skinExtractor->SetInputConnection(v16->GetOutputPort());
skinExtractor->SetInputConnection(smoothFilter->GetOutputPort());
//skinExtractor->SetValue(0, 392);//设置值为*的等值线
//skinExtractor->SetValue(1, 394);//设置值为*的等值线
//skinExtractor->GenerateValues(10, 370, 400);//生成等分的10个等值线
skinExtractor->GenerateValues(20, rangeMin, rangeMax);//生成等分的*个等值线
// 是一个过滤器Filter,用来计算法向量,对锐边缘(sharp Edge)进行处理
vtkPolyDataNormals *skinNormals = vtkPolyDataNormals::New();
skinNormals->SetInputConnection(skinExtractor->GetOutputPort());
skinNormals->SetFeatureAngle(160.0);
//创建颜色表 这里只输入颜色值的数量,然后自动生成表
vtkLookupTable *lut = vtkLookupTable::New();
lut->SetTableRange(pointScalar->GetRange());
lut->SetHueRange(0.85, 0.0); //色调范围从紫色到红色
lut->Build();
vtkPolyDataMapper *skinMapper = vtkPolyDataMapper::New();
skinMapper->SetInputConnection(skinNormals->GetOutputPort());
skinMapper->SetLookupTable(lut);
skinMapper->SetScalarRange(pointScalar->GetRange());
//skinMapper->ScalarVisibilityOff();//不显示多颜色
vtkActor *skinActor = vtkActor::New();
skinActor->SetMapper(skinMapper);
//【加颜色映射表】
vtkScalarBarActor *barActor = vtkScalarBarActor::New();
barActor->SetLookupTable(lut);
// 绘制外部轮廓的正方体
vtkOutlineFilter *outlineData = vtkOutlineFilter::New();
//outlineData->SetInputConnection(v16->GetOutputPort());
outlineData->SetInputConnection(delaunay->GetOutputPort());
vtkPolyDataMapper *mapOutline = vtkPolyDataMapper::New();
mapOutline->SetInputConnection(outlineData->GetOutputPort());
vtkActor* outline_actor = vtkActor::New();
outline_actor->SetMapper(mapOutline);
outline_actor->GetProperty()->SetColor(0, 0, 0);
vtkCamera *aCamera = vtkCamera::New();
//aCamera->SetViewUp(0, 0, -1);
aCamera->SetViewUp(1, 1, 0);
//aCamera->SetPosition(0, 1, 0);
aCamera->SetPosition(-1, -1, 0.5);
aCamera->SetFocalPoint(0, 0, 0);
aCamera->ComputeViewPlaneNormal();
aCamera->Dolly(1.5);
vtkRenderer *aRender = vtkRenderer::New();
aRender->AddActor(outline_actor);
aRender->AddActor(skinActor);
aRender->AddActor(barActor);
aRender->SetActiveCamera(aCamera);
aRender->ResetCamera();
//aRender->SetBackground(1, 1, 1);
aRender->SetBackground(0.5, 0.5, 0.5);
aRender->ResetCameraClippingRange();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(aRender);
renWin->SetSize(640, 480);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
iren->Initialize();
iren->Start();
system("pause");
return 0;
}