完整教程: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;}

posted @ 2025-07-22 20:06  yjbjingcha  阅读(50)  评论(0)    收藏  举报