学习笔记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来设置多个图像文件名,由多个二维图像组成三维

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容