学习笔记2-基本数据结构和数据的读写

VTK可视化管线是完成VTK应用程序这道菜的基本步骤,VTK数据结构就是每一道菜的基本原料

基本数据结构

可视化数据的基本特点:
  1. 离散型:点与点之间的值是不可知的,要得到该值,需要通过插值的方式获取
  2. 数据具有规则或不规则的结构
    对于规则的结构数据,只需要存储起始点, 相邻两点之间的间隔和总数即可保存完整的信息
    不规则的数据结构在数据表达方面更加自由细致灵活
  3. 数据具有维度
    拓扑维度
数据对象和数据集
  1. 数据对象
    数据一般以数据对象形式表现
    只有当数据对象被组织册灰姑娘一种结构后,才能被VTK算法处理
    vtkDataObject 根据具体可视化数据选用
企业微信截图_16748939564419.png
  1. 数据集
    vtkDataSet 将数据对象组织成一种结构并且赋予相应的属性值,就形成了数据集.
    vtkDataSet 由拓扑结构和几何结构组成:
    点数据定义的坐标点形成了几何结构,点数据的链接形成单元数据,由单元数据形成数据集的拓扑结构


    企业微信截图_16749714227221.png
  2. 单元
    一系列有序的点按照指定类型连接所定义的结构就是单元,单元是VTK的基础
    单元类型分为线性单元和非线性单元


    线性单元.png

    非线性单元.png
  1. 属性数据
    主要用于描述数据集的属性特征,对数据集的可视化实质就是对属性数据的可视化
    分为标量数据(指标是数据的大小,最普遍的可视化数据),矢量数据(有大小有方向),张量数据
数据集

vtkImageData(非常重要) :按照规则排列在矩形方格中的点和单元的集合 常用于医学图像
vtkPolyData:多边形数据集,该类由以下数据组成,并都是通过vtkDataArray(建立VTK数据对象的基础)形式存储,使用时应指定元组大小

  • 几何数据 vtkPoints
  • 拓扑数据 vtkCellArray
  • 属性数据 vtkPointData vtkCellData vtkFieldData

实现三角形:

#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkConeSource.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkLight.h>
#include <vtkCamera.h>
#include <vtkActor2D.h>
#include <vtkPlaneSource.h>
#include <vtkAxesActor.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkPoints.h>
#include <vtkLine.h>
#include <vtkCellArray.h>
#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

using namespace std;

int main()
{
    /// <summary>
    /// 创建坐标点,几何数据
    /// </summary>
    /// <returns></returns>
    vtkSmartPointer<vtkPoints> source = vtkSmartPointer<vtkPoints>::New();
    source->InsertNextPoint(1.0, 0.0, 0.0);
    source->InsertNextPoint(0.0, 1.0, 0.0);
    source->InsertNextPoint(0.0, 0.0, 0.0);

    /// <summary>
    /// 连接点,实现拓扑结构
    /// </summary>
    /// <returns></returns>
    vtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();
    line0->GetPointIds()->SetId(0, 0);
    line0->GetPointIds()->SetId(1, 1);

    vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();
    line1->GetPointIds()->SetId(0, 1);
    line1->GetPointIds()->SetId(1, 2);

    vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();
    line2->GetPointIds()->SetId(0, 2);
    line2->GetPointIds()->SetId(1, 0);

    ///创建单元数组
    vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
    lines->InsertNextCell(line0);
    lines->InsertNextCell(line1);
    lines->InsertNextCell(line2);

    //以上数据组合成一个vtkPolyData
    vtkSmartPointer<vtkPolyData> polyData =
        vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(source);
    polyData->SetLines(lines);




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


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

    
    //vtkSmartPointer<vtkAxesActor> axesActor =
    //    vtkSmartPointer<vtkAxesActor>::New();

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

    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

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

    renderer->ResetCamera();
    renderWindow->Render();
    renderWindowInteractor->Start();
    return 0;
}

VTK数据的读写

数据的获取方式
  1. 生成模型,然后处理模型数据
  2. 从外部存储介质里导入相关的数据文件,步骤如下:
  • 实例化Reader对象
  • 指定要读取的文件名
  • 调用Update()方法促使管线执行
vtkImageData

vtkDicomImageReader用于读取dicom图像,但是不支持多帧图像 ITK封装了GDCM对DICOM读写
对于序列图像文件,可以采用SetFileNames来设置多个图像文件名,由多个二维图像组成三维

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容