文档章节

VTK入门(二)--颜色映射

qt_plus
 qt_plus
发布于 2017/01/16 14:41
字数 902
阅读 183
收藏 0
VTK

在vtk中颜色映射是可视化技术中最常用的,是根据属性值来对物体进行着色,将颜色查找表中的颜色映射到点或单元的属性值上,绘制时就可以用这些颜色值来绘制点和单元了。

接下来编写一个梯形实例来体现颜色映射算法,写代码前我们需要做如下准备:

 

  1. 属性数据
    首先要介绍的是vtkDataSet这个类,vtkDataSet是所以数据集的父类,这里谈的可视化也都是对vtkDataSet数据对象进行的可视化,当然了,vtkPolyData、vtkImageData等子类也同样适用。
    属性数据可以被表示为标量、张量、矢量、法向量等形式。vtk中包括点属性数据和单元属性数据,每个属性数据都分别和vtkDataSet数据相关联。可以用vtkDataArray 的子类来存储,vtkFloatArray等。
    讲了这么多属性数据的概念就是为了创建属性数据为颜色映射做准备,通常可以按这个顺序进行创建:创建数组->分配大小->与数据集关联。
  2. 可视化多边形
    多边形数据由点、线、三角形、三角带、多边形等基本单元构成(vtkPolyData),大部分过滤器都可以对这些数据进行处理。有些过滤器(比如vtkDecimatePro 和vtkTubeFilter)仅仅处理这种类型数据的一部分(三角网格和线)。
    首先构造多边形数据,可以通过创建vtkPoints和vtkCellArrays的对象来存储点和单元,然后构造多边形数据,最后进行映射。
  3. 颜色查找表
    我们可以手动创建一个颜色查找表,如果没有创造的话,贴心的vtk会自动为我们生成一个默认的颜色查找表,颜色查找表中允许我们自由设定颜色值。vtkLookupTable可以帮助我们来完成这个工作,同时,设定了颜色数量时,SetTabValue()方法可以将颜色值插入到指定的位置。另外,SetScalarRange()告诉我们采取什么方法映射,标量值大于最大值的将被归为最大值,标量值小于最小值的将被归为最小,因为颜色索引是根据属性的最值建立的。

准备工作做完了,下面直接贴代码,相应的注释跟在代码后面。

#include "vtkActor.h"
#include "vtkCamera.h"
#include "vtkConeSource.h"
#include "vtkCellArray.h"
#include "vtkFloatArray.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include <vtkLookupTable.h>
int main()
{
	int i;
	//梯形的顶点坐标
	static float x[8][3]={{0,0,0}, {4,0,0}, {4,4,0}, {0,4,0},
	{1,1,1}, {3,1,1}, {3,3,1}, {1,3,1}};
	//4个顶点构成一个单元,一共6个单元
	static vtkIdType y[6][4]={{0,1,2,3}, {4,5,6,7}, {0,1,5,4},
	{1,2,6,5}, {2,3,7,6}, {3,0,4,7}};

	vtkPoints *points = vtkPoints::New();
	for(i=0;i<8;i++)
		points->InsertPoint(i,x[i]);

	vtkCellArray *polys = vtkCellArray::New();
	for(i=0;i<6;i++)
		polys->InsertNextCell(4,y[i]);
	//存储标量值
	vtkFloatArray *scalars = vtkFloatArray::New();
	for(i=0;i<8;i++)
		scalars->InsertTuple1(i,i);
	//构建多边形数据
	vtkPolyData *cube = vtkPolyData::New();
	cube->SetPoints(points);
	//设定单元的组成方式
	cube->SetPolys(polys);
	cube->GetPointData()->SetScalars(scalars);

	//定义颜色映射表
	vtkLookupTable *pColorTable=vtkLookupTable::New();
	pColorTable->SetNumberOfColors(6);
	pColorTable->SetTableValue(0,1.0,0.0,1.0,1.0);
	pColorTable->SetTableValue(1,0.0,1.0,1.0,1.0);
	pColorTable->SetTableValue(2,1.0,1.0,1.0,1.0);
	pColorTable->SetTableValue(3,1.0,0.0,1.0,1.0);
	pColorTable->SetTableValue(4,0.0,0.0,1.0,1.0);
	pColorTable->SetTableValue(5,1.0,1.0,0.0,1.0);
	pColorTable->Build();
	
	//数据映射
	vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
	cubeMapper->SetInput(cube);
	cubeMapper->SetScalarRange(0,7);
	cubeMapper->SetLookupTable(pColorTable);
	vtkActor *cubeActor = vtkActor::New();
	cubeActor->SetMapper(cubeMapper);
	
	vtkCamera *camera = vtkCamera::New();
	camera->SetPosition(1,1,1);
	camera->SetFocalPoint(0,0,0);

	vtkRenderer *renderer = vtkRenderer::New();
	vtkRenderWindow *renWin = vtkRenderWindow::New();
	renWin->AddRenderer(renderer);

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(renWin);
	renderer->AddActor(cubeActor);
	renderer->SetActiveCamera(camera);
	renderer->ResetCamera();
	renderer->SetBackground(1,1,1);
	renWin->SetSize(400,400);
	renWin->Render();
	iren->Start();
	//删除
	points->Delete();
	polys->Delete();
	scalars->Delete();
	cube->Delete();
	cubeMapper->Delete();
	cubeActor->Delete();
	camera->Delete();
	renderer->Delete();
	renWin->Delete();
	iren->Delete();
	pColorTable->Delete();
	return 0;
}


© 著作权归作者所有

共有 人打赏支持
qt_plus
粉丝 5
博文 97
码字总数 28684
作品 0
石家庄
程序员
私信 提问
VTK面绘制(SR)与体绘制(VR)

面绘制 (Surface Rendering) VTK中基于面绘制实现三维重建,使用的是经典的Marching Cubes(移动立方体法)算法。      面绘制是采用分割技术对一系列的二维图像进行轮廓识别、提取等操作,...

006玩命
2018/05/08
0
0
VTK 实现MinIP Activiz

public partial class Form1 : Form { #region 私有变量 private Kitware.VTK.vtkRenderer render = null; private Kitware.VTK.vtkRenderWindow renWin = null; private Kitware.VTK.vtkRen......

小王爷和老王爷
2015/11/27
67
0
VTK5.6安装配置教程

1. 必须下载: vtk-5.6.0-win32.exe vtk-5.6.0.zip 源程序 vtkdata-5.6.0.zip 数据 (vtk相关安装程序下载:http://vtk.org) cmake-2.8.2-win32-x86.zip (cmake程序下载:http://www.cmak......

teacheryang
2010/10/12
0
0
Activiz 使用笔记 (6) 图像数据及其处理

http://image.szpt.edu.cn/UploadFiles/%E5%9B%BE%E5%83%8F%E6%95%B0%E6%8D%AE%E5%8F%8A%E5%85%B6%E5%A4%84%E7%90%86.swf 图像数据集用类vtkImageData表示。其结构与结构化点数据集是一样的,......

小王爷和老王爷
2015/11/26
99
0
5.6.2图形处理之纹理映射vtkTextureMapToCylinder

vtkTextureMapToCylinder   VTK中定义了多个类实现纹理空间到模型空间的映射,例如vtkTextureMapToPlane通过一个平面建立纹理空间到模型空间的 映射关系;vtkTextureMapToCylinder通过圆柱...

webzhuce
2018/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue.js开发环境搭建说明(mac)

vue开发环境搭建(mac) 投影放大:cmd + + 安装Node 下载Node 官网下载 https://nodejs.org/en/download/ 安装Node 双击安装包,选择安装目录,比如: /usr/local/bin 安装成功后最好记录一...

Danni3
5分钟前
0
0
Qt编写自定义控件3-速度仪表盘

前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业...

飞扬青云
11分钟前
0
0
【论文阅读】Image Super-Resolution via Deep Recursive Residual Network

题目:通过深度递归残差网络实现图像的超分辨率 摘要: 近年来,基于卷积神经网络的模型在单张图像的超分辨率上已经取得了巨大的成功。由于深度网络的强大,这些CNN模型学习了从低分辨率输入...

云烟成雨forever
13分钟前
0
0
为什么强烈建议大家使用枚举来实现单例

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

群星纪元
31分钟前
10
0
Confluence 6 超过当前许可证期限进行升级

这个页面将会对你在进行 Confluence 升级的时候超过了当前许可证的期限进行升级的情况。 许可证警告 在升级的过程中,你将会在 Confluence 的应用程序日志(log file)中看到类似下面的错误提...

honeymoose
44分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部