【QT+VTK 学习笔记】13:VTK图形处理1

前言

“VTK图形图像开发进阶_张晓东_罗火灵”的学习笔记。
东灵工作室 教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686

学习资料

VTK官网学习地址:https://vtk.org/doc/nightly/html/

一、vtkPolyData数据生成与显示

由【QT+VTK 学习笔记】04:VTK基本数据结构可知
vtkPolyData主要由几何结构数据、拓扑结构数据和属性数据组成。 几何结构数据主要是组成模型的点集;拓扑结构数据则是由这些点根据一定的连接关系组成的单元数据,表明了几何点集之间的拓扑关系;而属性数据与几何结构数据和拓扑结构数据 相关联,属性数据可以是标量、向量或者张量。
在这里插入图片描述

1.1vtkPolyData数据源

下表列出了常见的几种vtkPolyData数据源类。
在这里插入图片描述

1.2vtkPolyData 数据的创建

在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)

#include <vtkSmartPointer.h>
#include <vtkPolygon.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>

#include <iostream>

int main(int argc, char *argv[])
{
    vtkSmartPointer<vtkPoints> points =
        vtkSmartPointer<vtkPoints>::New();
    points->InsertNextPoint(0.0, 0.0, 0.0);
    points->InsertNextPoint(1.0, 0.0, 0.0);
    points->InsertNextPoint(1.0, 1.0, 0.0);
    points->InsertNextPoint(0.0, 1.0, 0.0);
    points->InsertNextPoint(2.0, 0.0, 0.0);
    //生成正方形  多边形单元
    vtkSmartPointer<vtkPolygon> polygon =
        vtkSmartPointer<vtkPolygon>::New();
    polygon->GetPointIds()->SetNumberOfIds(4);
    polygon->GetPointIds()->SetId(0, 0);
    polygon->GetPointIds()->SetId(1, 1);
    polygon->GetPointIds()->SetId(2, 2);
    polygon->GetPointIds()->SetId(3, 3);
    //生成三角形  多边形单元
    vtkSmartPointer<vtkTriangle> trianle =
        vtkSmartPointer<vtkTriangle>::New();
    trianle->GetPointIds()->SetId(0, 1);
    trianle->GetPointIds()->SetId(1, 2);
    trianle->GetPointIds()->SetId(2, 4);
    //存储所有单元数据
    vtkSmartPointer<vtkCellArray> cells =
        vtkSmartPointer<vtkCellArray>::New();
    cells->InsertNextCell(polygon);
    cells->InsertNextCell(trianle);

    vtkSmartPointer<vtkPolyData> polygonPolyData =
        vtkSmartPointer<vtkPolyData>::New();
    polygonPolyData->SetPoints(points);     //设置点数据
    /*
    SetPolys接受的是多边形单元数组,如果是单元类型为顶点,线段或者 三角形带的话,则调用如下函数:
    void SetVerts (vtkCellArray* v);
    void SetLines (vtkCellArray* 1); void SetStrips (vtkCellArray* s);
    */
    polygonPolyData->SetPolys(cells);       //设置单元数据

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polygonPolyData);

    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(0.5, 0.5, 0.5);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize( 640, 480 );
    renderWindow->Render();
    renderWindow->SetWindowName("PolyDataNew");


    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

1.3vtkPolyData 属性数据

属性数据包括点属性和单元属性,可为vtkPolyData的点数据和单元数据分别指定属性数据。而属性数据可以是标量,如点的曲率;也可以是向量,如点或者单元的法向量;也可以是张量,主要在流场中较为常见。颜色可以直接作为一种标量属性数据,设置到相应的点或者单元数据中,这也是最直接的种图形着色方式。

在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)

#include <vtkSmartPointer.h>
#include <vtkPolygon.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLookupTable.h>
#include <vtkTransformTextureCoords.h>
#include <iostream>

int main(int argc, char *argv[])
{
    vtkSmartPointer<vtkPoints> points =
        vtkSmartPointer<vtkPoints>::New();
    points->InsertNextPoint(0.0, 0.0, 0.0);
    points->InsertNextPoint(1.0, 0.0, 0.0);
    points->InsertNextPoint(1.0, 1.0, 0.0);
    points->InsertNextPoint(0.0, 1.0, 0.0);
    points->InsertNextPoint(2.0, 0.0, 0.0);
    //生成正方形  多边形单元
    vtkSmartPointer<vtkPolygon> polygon =
        vtkSmartPointer<vtkPolygon>::New();
    polygon->GetPointIds()->SetNumberOfIds(4);
    polygon->GetPointIds()->SetId(0, 0);
    polygon->GetPointIds()->SetId(1, 1);
    polygon->GetPointIds()->SetId(2, 2);
    polygon->GetPointIds()->SetId(3, 3);
    //生成三角形  多边形单元
    vtkSmartPointer<vtkTriangle> trianle =
        vtkSmartPointer<vtkTriangle>::New();
    trianle->GetPointIds()->SetId(0, 1);
    trianle->GetPointIds()->SetId(1, 2);
    trianle->GetPointIds()->SetId(2, 4);
    //存储所有单元数据
    vtkSmartPointer<vtkCellArray> cells =
        vtkSmartPointer<vtkCellArray>::New();
    cells->InsertNextCell(polygon);
    cells->InsertNextCell(trianle);

    vtkSmartPointer<vtkPolyData> polygonPolyData =
        vtkSmartPointer<vtkPolyData>::New();
    polygonPolyData->SetPoints(points);     //设置点数据
    /*
    SetPolys接受的是多边形单元数组,如果是单元类型为顶点,线段或者 三角形带的话,则调用如下函数:
    void SetVerts (vtkCellArray* v);
    void SetLines (vtkCellArray* 1); void SetStrips (vtkCellArray* s);
    */
    polygonPolyData->SetPolys(cells);       //设置单元数据

    unsigned char red[3]   = {255, 0, 0};
    unsigned char green[3] = {0, 255, 0};
    unsigned char blue[3]  = {0, 0, 255};

    vtkSmartPointer<vtkUnsignedCharArray> pointColors =
        vtkSmartPointer<vtkUnsignedCharArray>::New();
    pointColors->SetNumberOfComponents(3);  //设置rbg三通道组分
    pointColors->InsertNextTypedTuple(red);
    pointColors->InsertNextTypedTuple(green);
    pointColors->InsertNextTypedTuple(blue);
    pointColors->InsertNextTypedTuple(green);
    pointColors->InsertNextTypedTuple(red);
    polygonPolyData->GetPointData()->SetScalars(pointColors);

    vtkSmartPointer<vtkUnsignedCharArray> cellColors =
        vtkSmartPointer<vtkUnsignedCharArray>::New();
    cellColors->SetNumberOfComponents(3);
    cellColors->InsertNextTypedTuple(red);
    cellColors->InsertNextTypedTuple(green);
    polygonPolyData->GetCellData()->SetScalars(cellColors);

    vtkSmartPointer<vtkIntArray> pointfield =
        vtkSmartPointer<vtkIntArray>::New();
    pointfield->SetName("Field");
    pointfield->SetNumberOfComponents(3);
    pointfield->InsertNextTuple3(1,0,0);
    pointfield->InsertNextTuple3(2,0,0);
    pointfield->InsertNextTuple3(3,0,0);
    pointfield->InsertNextTuple3(4,0,0);
    pointfield->InsertNextTuple3(5,0,0);
    polygonPolyData->GetPointData()->AddArray(pointfield);

    vtkSmartPointer<vtkLookupTable> lut =
        vtkSmartPointer<vtkLookupTable>::New();
    lut->SetNumberOfTableValues(10);
    lut->Build();
    lut->SetTableValue(0     , 0     , 0     , 0, 1);
    lut->SetTableValue(1, 0.8900, 0.8100, 0.3400, 1);
    lut->SetTableValue(2, 1.0000, 0.3882, 0.2784, 1);
    lut->SetTableValue(3, 0.9608, 0.8706, 0.7020, 1);
    lut->SetTableValue(4, 0.9020, 0.9020, 0.9804, 1);
    lut->SetTableValue(5, 1.0000, 0.4900, 0.2500, 1);
    lut->SetTableValue(6, 0.5300, 0.1500, 0.3400, 1);
    lut->SetTableValue(7, 0.9804, 0.5020, 0.4471, 1);
    lut->SetTableValue(8, 0.7400, 0.9900, 0.7900, 1);
    lut->SetTableValue(9, 0.2000, 0.6300, 0.7900, 1);

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polygonPolyData);
    //mapper->SetScalarModeToUseCellData();
    //mapper->SetScalarModeToUsePointFieldData();
    //mapper->ColorByArrayComponent("Field", 0);
    //mapper->SelectColorArray("Field");
    //mapper->SetScalarRange(1,5);
    mapper->SetLookupTable(lut);

    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(1.0,1.0,1.0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize( 640, 480 );
    renderWindow->Render();
    renderWindow->SetWindowName("PolyDataColor");

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}


在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)

#include <vtkSmartPointer.h>
#include <vtkPolygon.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkFloatArray.h>
#include <vtkPlaneSource.h>
#include <vtkCellDataToPointData.h>
#include <vtkPointDataToCellData.h>
#include <vtkDataSet.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLookupTable.h>

#include <iostream>

int main(int argc, char *argv[])
{
    vtkSmartPointer<vtkPlaneSource> gridSource =
        vtkSmartPointer<vtkPlaneSource>::New();
    gridSource->SetXResolution(3);
    gridSource->SetYResolution(3);
    gridSource->Update();
    vtkSmartPointer<vtkPolyData> grid = gridSource->GetOutput();

    vtkSmartPointer<vtkFloatArray> cellScalars =
        vtkSmartPointer<vtkFloatArray>::New();
    vtkSmartPointer<vtkFloatArray> cellVectors =
        vtkSmartPointer<vtkFloatArray>::New();
    cellVectors->SetNumberOfComponents(3);

    for (int i = 0; i < 9; i++)
    {
        cellScalars->InsertNextValue(i + 1);            //插入标量数据
        cellVectors->InsertNextTuple3(0.0, 0.0, 1.0);   //插入向量数据
    }
    grid->GetCellData()->SetScalars(cellScalars);
    grid->GetCellData()->SetVectors(cellVectors);

    vtkSmartPointer<vtkLookupTable> lut =
        vtkSmartPointer<vtkLookupTable>::New();
    lut->SetNumberOfTableValues(10);
    lut->Build();
    lut->SetTableValue(0     , 0     , 0     , 0, 1);
    lut->SetTableValue(1, 0.8900, 0.8100, 0.3400, 1);
    lut->SetTableValue(2, 1.0000, 0.3882, 0.2784, 1);
    lut->SetTableValue(3, 0.9608, 0.8706, 0.7020, 1);
    lut->SetTableValue(4, 0.9020, 0.9020, 0.9804, 1);
    lut->SetTableValue(5, 1.0000, 0.4900, 0.2500, 1);
    lut->SetTableValue(6, 0.5300, 0.1500, 0.3400, 1);
    lut->SetTableValue(7, 0.9804, 0.5020, 0.4471, 1);
    lut->SetTableValue(8, 0.7400, 0.9900, 0.7900, 1);
    lut->SetTableValue(9, 0.2000, 0.6300, 0.7900, 1);

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(grid);//使用网格单元属性数据

//    //测试单元属性数据转点属性数据
//    vtkSmartPointer<vtkCellDataToPointData> convert =
//        vtkSmartPointer<vtkCellDataToPointData>::New();
//    convert->SetInputData(grid);
//    convert->SetPassCellData(true);
//    convert->Update();
//    mapper->SetInputData((vtkPolyData*)convert->GetOutput());

	//SetScalarRange() 指定了颜色映射范围的最小值和最大值,当标量值大于最大值时,按定义的最大值获取颜色; 当小于最小值时,按指定的最小值获取颜色。
    mapper->SetScalarRange(0, 9);
    mapper->SetLookupTable(lut);

    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(1.0,1.0,1.0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize( 640, 480 );
    renderWindow->Render();
    renderWindow->SetWindowName("PolyDataAttribute");

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

由于可以同时为点和单元设置属性,那么怎样用点或单元控制颜色呢?这就需要使用 vtkPolyDataMapper 类的方法。
•SetScalarModeToDefault()默认设置。该设置下首先使用点标量数据控制颜色。当点 标量数据不可用时,如果存在可用的单元数据,则以单元数据为准。
•SetScalarModeToUsePointData()。该设置下使用点标量数据着色。如果点标量数据不可 用,也不会使用其他标量数据着色。
•SetScalarModeToUseCellData()»该设置下使用单元标量数据着色。如果单元标量数据 不可用,也不会使用其他标量数据着色。
•SetScalarModeToUsePointFieldData()/SetScalarModeToUseCellFieldData()该设置下点标量数据和单元标量数据都不会用来着色,而是使用点属性数据中的场数据数组。

二、基本的图形操作

VTK中提供了多种图形的基本操作,其中最简单的是点的欧式距离计算,可以使用 vtkMath进行计算,也可以直接计算向量的模。
一些图元类提供了许多可以方便使用的静态函数,如
1.vtkLine提供了点与线间的距离计算、线与线间的距离计算等;
2.vtkTriangle提供了面积、 外接圆、法向量的计算,点与三角形位置关系的判断等;3.vtkPolygen中提供了法向量、重心、 面积的计算、点与多边形位置判断、点与多边形距离、多边形与多边形相交判断等;
4.vtkTetra 中实现了四面体体积、重心计算等。
5.vtkMassProperties这个类可以实现三角网格的表面积和体积的计算,但是要求网格必须是封闭的三角形网格数据,程序演示如下。
在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)

#include <vtkSmartPointer.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkScalarBarActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkCubeSource.h>
#include <vtkProperty.h>
#include <vtkTriangleFilter.h>
#include <vtkMassProperties.h>
#include <vtkConeSource.h>
int main(int argc, char *argv[])
{
    vtkSmartPointer<vtkConeSource> cubeSource =
        vtkSmartPointer<vtkConeSource>::New();
    cubeSource->Update();

    vtkSmartPointer<vtkTriangleFilter> triFilter =
        vtkSmartPointer<vtkTriangleFilter>::New();
    triFilter->SetInputData(cubeSource->GetOutput());
    triFilter->Update();

    //计算三角网格模型面积、体积
    vtkSmartPointer<vtkMassProperties> massProp =
        vtkSmartPointer<vtkMassProperties>::New();
    massProp->SetInputData(triFilter->GetOutput());
    float vol = massProp->GetVolume();          //网格的体积
    float area= massProp->GetSurfaceArea();     //表面积
    float maxArea = massProp->GetMaxCellArea(); //最大单元面积
    float minArea = massProp->GetMinCellArea(); //最小单元面积

    std::cout<<"Volume      :"<<vol<<std::endl;
    std::cout<<"Surface Area:"<<area<<std::endl;
    std::cout<<"Max Area    :"<<maxArea<<std::endl;
    std::cout<<"Min Area    :"<<minArea<<std::endl;

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    //mapper->SetInputData(cubeSource->GetOutput());
    mapper->SetInputData(triFilter->GetOutput());

    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(0,1,0);
    actor->GetProperty()->SetEdgeColor(1,0,0);
    actor->GetProperty()->SetEdgeVisibility(1);

    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(1.0,1.0,1.0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize( 640, 480 );
    renderWindow->Render();
    renderWindow->SetWindowName("PolyDataMassProperty");

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

三维网格测地距离

对于三维网格模型来讲,测地距离也是一种重要的距离度量。与欧氏距离不同,一个三维模型上的亮点测地距离是指沿着模型表面两者之间的最短距离。测地距离通常采用Dijkstra算法类近似求解。VTK中的vtkDijkstraGraphGeodesicPath类就可以实现测地距离的求解。
在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)


#include <vtkSphereSource.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkDijkstraGraphGeodesicPath.h>

int main(int , char *[])
{
    vtkSmartPointer<vtkSphereSource> sphereSource =
        vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->Update();

    vtkSmartPointer<vtkDijkstraGraphGeodesicPath> dijkstra =
        vtkSmartPointer<vtkDijkstraGraphGeodesicPath>::New();
    dijkstra->SetInputData(sphereSource->GetOutput());
    //计算测地距离时,指定球面上两个点的索引号
    dijkstra->SetStartVertex(0);    //设置开始点
    dijkstra->SetEndVertex(9);      //设置结束点
    dijkstra->Update();

    vtkSmartPointer<vtkPolyDataMapper> pathMapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    pathMapper->SetInputData(dijkstra->GetOutput());

    vtkSmartPointer<vtkActor> pathActor =
        vtkSmartPointer<vtkActor>::New();
    pathActor->SetMapper(pathMapper);
    pathActor->GetProperty()->SetColor(1,0,0);
    pathActor->GetProperty()->SetLineWidth(4);

    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(sphereSource->GetOutput());

    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->AddActor(pathActor);
    renderer->SetBackground(1.0, 1.0, 1.0);

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize( 640, 480 );
    renderWindow->Render();
    renderWindow->SetWindowName("PolyDataGeodesic");

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

三维图像的包围盒

包围盒是指能够包围模型的最小立方体,常常用于模型的碰撞测量中。vtkPolyData中定义了函数GetBounds()来获取包围盒的参数。即三个坐标轴方向上的最大、最小值。仅仅获取这些参数并不直观,有时候还需要显示包围盒。vtkOutlineFilter则提供了一个方便的方法来生成包围盒,其输入为一个vtkPolyData莫形数据,输出同样为一个vtkPolyData类型数据,因此非常容易进行可视化显示。
在这里插入图片描述

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)

#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkProperty.h>
#include <vtkOutlineFilter.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main()
{
    vtkSmartPointer<vtkSphereSource> sphereSource =
            vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetCenter(0.0, 0.0, 0.0);
    sphereSource->SetRadius(5.0);
    sphereSource->Update();

    vtkPolyData* sphere = sphereSource->GetOutput();
    vtkSmartPointer<vtkOutlineFilter> outline =
            vtkSmartPointer<vtkOutlineFilter>::New();
    outline->SetInputData(sphere);
    outline->Update();//算法执行完毕,必须更新!!!

    vtkSmartPointer<vtkPolyDataMapper> mapper =
            vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(sphere);
    vtkSmartPointer<vtkPolyDataMapper> outlineMapper =
            vtkSmartPointer<vtkPolyDataMapper>::New();
    outlineMapper->SetInputData(outline->GetOutput());

    vtkSmartPointer<vtkActor> actor =
            vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    vtkSmartPointer<vtkActor> outlineActor =
            vtkSmartPointer<vtkActor>::New();
    outlineActor->SetMapper(outlineMapper);
    outlineActor->GetProperty()->SetColor(0, 1, 0);
    outlineActor->GetProperty()->SetLineWidth(3);

    vtkSmartPointer<vtkRenderer> renderer =
            vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->AddActor(outlineActor);
    renderer->SetBackground(0, 0, 0);

    vtkSmartPointer<vtkRenderWindow> rw =
            vtkSmartPointer<vtkRenderWindow>::New();
    rw->AddRenderer(renderer);
    rw->SetSize(640, 480);;
    rw->SetWindowName("PolyData Bounding Box");
    rw->Render();

    vtkSmartPointer<vtkRenderWindowInteractor> rwi =
            vtkSmartPointer<vtkRenderWindowInteractor>::New();
    rwi->SetRenderWindow(rw);
    rwi->Start();
    return 0;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT是一个跨平台的C++图形界面应用程序框架,VTK是一个用于可视化和图形处理的开源库,而PRO脚本则是为了编写QTVTK程序而设计的脚本语言。 在使用QTVTK开发可视化应用程序时,PRO脚本可以帮助我们简化代码编写和操作。 在编写QT VTK程序时,PRO脚本可以用来管理程序的构建过程。我们可以编写一个.pro文件,其中包含编译、链接和运行程序所需的信息和指令。PRO脚本可以指定程序所依赖的库、头文件的路径和源文件的位置等等。通过简单地修改.pro文件,我们就可以非常方便地修改程序的编译和链接选项。 此外,PRO脚本还可以用来配置QTVTK程序的构建环境。我们可以通过指定不同的编译器、库和路径来定制程序的运行环境。PRO脚本可以帮助我们在不同的平台上使用相同的代码进行构建。 在QTVTK程序中,使用PRO脚本可以提高代码的可维护性和可重用性。我们可以将一些公共的编译和链接选项抽象为变量,在不同的项目中进行复用。此外,PRO脚本还可以定义自定义的构建目标,以及一些自定义的构建规则。 总之,QT VTK PRO脚本是用于编写QTVTK程序时的一种工具。它可以帮助我们管理程序的构建过程和配置环境,提高代码的可维护性和可重用性,使我们能够更方便地开发和调试可视化应用程序。 ### 回答2: Qt VTK Pro脚本是用于在Qt框架中集成VTK(Visualization Toolkit)库的一种脚本。VTK是一个用于三维可视化、图像处理和计算几何方面的开源工具包,提供了丰富的功能和算法用于处理和呈现三维数据。 Qt VTK Pro脚本主要用于简化在Qt应用程序中使用VTK库的过程。它提供了一种方便的方法来创建和管理VTK对象、渲染场景、添加交互功能等。使用该脚本,开发人员可以更轻松地将VTK功能集成到他们的Qt应用程序中。 通过Qt VTK Pro脚本,开发人员可以使用VTK库创建各种类型的3D图形,包括几何体、图像数据、曲线、体积数据等。它还提供了各种渲染技术,如体积渲染、剖面渲染、表面渲染等。 此外,Qt VTK Pro脚本还支持用户交互,允许用户与创建的3D图形进行交互。这可以通过添加鼠标事件、键盘事件等来实现。用户可以旋转、平移、缩放图形,选择对象、改变物体的属性等。 总之,Qt VTK Pro脚本为开发人员提供了一种快速、简便的方式来在他们的Qt应用程序中集成VTK库,从而使他们能够利用VTK的强大功能来处理和呈现三维数据。它使得开发3D可视化应用程序变得更加高效和灵活。 ### 回答3: Qt VTK Pro 脚本是一个用于与QtVTK和Pro软件集成的脚本。 Qt是一个跨平台的C++图形用户界面开发框架,它提供了丰富的GUI组件和工具,使开发人员能够方便地创建功能强大的应用程序。 VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件库。它提供了许多可用于创建复杂可视化效果的算法和工具。 Pro是一种为软件项目管理而设计的构建工具。它提供了一种简单且强大的方式来构建、部署和管理软件项目。 Qt VTK Pro脚本的目的是将QtVTK和Pro集成在一起,以便更方便地开发、构建和管理应用程序。 通过使用Qt VTK Pro脚本,开发人员可以使用Qt的GUI组件来构建应用程序的用户界面。他们还可以使用VTK算法和工具来创建复杂的可视化效果。同时,Pro工具使开发人员能够更轻松地构建、部署和管理他们的应用程序。 Qt VTK Pro脚本的使用可以在许多领域发挥作用。例如,在科学可视化中,它可以用于创建漂亮的3D可视化效果。在工程领域,它可以用于可视化和分析复杂的CAD数据。在医学图像处理中,它可以用于创建精确的医学图像可视化。 总之,Qt VTK Pro 脚本提供了一个强大的工具集,使开发人员能够更方便地将QtVTK和Pro集成在一起,从而创建出功能丰富、具有复杂可视化效果的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值