QT 5.9.2+VTK8.0实现等高线绘制

项目下载链接:QT5.9.2+VTK8.0实现等高线绘制资源-CSDN文库

示例如下:

主要代码如下:

cpp 复制代码
#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;
}
相关推荐
nice_lcj5203 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐3 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm5 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
春涧草茶5 小时前
慢就是快16-1协程
开发语言·前端·python
Dovis(誓平步青云)5 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄5 小时前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
.痞老板.7 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦7 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
青梅味猪大肠7 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
starzy19908 小时前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala