完整教程:QT 5.9.2+VTK8.0实现等高线绘制
项目下载链接: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 #include #include #include #include #include "vtkAutoInit.h"VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2VTK_MODULE_INIT(vtkInteractionStyle);using namespace std; int main(){ DataImport import; QVector points; QString PathName = "SrcData_Filtered.txt"; import.Data_ReadFromTXT(PathName, points); //【导入数据】 vtkSmartPointer vtk_points = vtkSmartPointer::New(); vtkSmartPointer cellArray = vtkSmartPointer::New(); vtkSmartPointer pointScalar = vtkSmartPointer::New(); for(unsigned int x=0; xInsertNextPoint(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 polydata = vtkSmartPointer::New(); polydata->SetPoints(vtk_points); //polydata->SetPolys(cellArray);//设置单元数据 polydata->GetPointData()->SetScalars(pointScalar);//设置点集标量 //表面重建方式1-vtkDelaunay2D vtkSmartPointer delaunay = vtkSmartPointer::New(); delaunay->SetInputData(polydata); delaunay->Update(); //重建后进行拉普拉斯平滑 vtkSmartPointer smoothFilter = vtkSmartPointer::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;}
浙公网安备 33010602011771号