- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
数据可视化主要是通过计算机图形学的方法,以图形、图像等形式清晰有效地传递、表达信息,VTK是数据可视化的工具包.
VTK全称(Visualization Toolkit),即可视化工具包,是一个开源、跨平台、可自由获取、支持并行处理图形应用函数库.
三维计算机图形、图形处理及可视化是VTK主要的应用方向。通过VTK可以根据许多学科(如建筑学、气象学、医学、生物学或者航空航天学)中的实验数据,进行逼真的体、面、光源等渲染,从而帮助人们理解那些采取错综复杂的、规模庞大的数字呈现形式的科学概念或结果.
VTK包含一个C++类库,众多的编程预约接口层,包括Tcl/Tk、Java、Python。VTK是在三维函数库OpenGL的基础上采用面向对象的设计方法发展起来的,它将可视化开发过程中会经常遇到的细节屏蔽起来,并封装了一些常用算法,比如,VTK将表面重建中比较常见的Marching Cubes算法封装起来,以类的形式供用户使用,这样在对三维规则点阵数据进行表面重建时就不必重复编写Marching Cubes算法的代码,只需直接使用VTK中已经提供的vtkMarchingCubes类即可.
VTK为从事可视化应用程序开发工作的研究人员提供技术支持,是一个强大的可视化开发工具。它具有如下特点.
1) VTK具有强大的三维图形功能。VTK既支持基于体素的体绘制(Voxel-Based Volume Rendering),又保留了传统的面绘制(surface Rendering),从而在极大地改善可视化效果的同时又可以充分利用现有的图形库和图形硬件。 2) VTK的体系结构使其具有非常好的流(Streaming)和高速缓存(Caching)的能力,在处理大量的数据时不必考虑内存资源的限制。 3) VTK能够更好地支持基于网络的工具,比如Java和VRML。随着Web和Internet技术的发展,VTK有着很好的发展前景。 4) VTK能够支持多种着色语言,如OpenGL等。 5) VTK具有设备无关性,这使得其代码具有良好的可移植性。 6) VTK中定义了无多宏,这些宏极大地简化了编程工作并且加强了一致的对象行为。 7) VTK具有丰富的数据类型,支持对多种数据类型进行处理。 8) VTK的跨平台特性方便了各类客户.
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
int main()
{
// vtkCylinderSource类派生自vtkPolyDataAlgorithm。生成vtkPolyData数据类型,主要生成一个中心在渲染场景原点的柱体,柱体长轴沿着Y轴,柱体的高度、截面半径等都可以任意指定。
vtkSmartPointer<vtkCylinderSource> cylinder =
vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetHeight( 3.0 ); //设置柱体的高
cylinder->SetRadius( 1.0 ); //设置柱体横截面的半径
cylinder->SetResolution( 10 ); //设置柱体横截面的等边多边形的边数。
// vtkPolyDataMapper类用于渲染多边形几何数据(vtkPolyData),派生类自vtkMapper,将输入的数据转换为几何图元(点、线、多边形)进行渲染。
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
// vtkPolyDataMapper::SetInputConnection():VTK可视化管线的输入数据接口,对应的可视化管线的输出数据接口为GetOutputPort(); VTK 5.0之前的版本使用SetInput()和GetOutput()作为输入输出接口,VTK5.X版本保留了对这两个接口的支持。
cylinderMapper->SetInputConnection( cylinder->GetOutputPort() );
// vtkActor类派生自vtkProp类,渲染场景中数据的可视化表达通过vtkProp的子类负责。比如该示例要渲染一个柱体,柱体的数据类型的vtkPolyData,数据要在场景中渲染时,不是直接把数据加入渲染场景,而是vtkProp的形式存在于渲染场景中。
// 三维空间中渲染对象最常用的vtkProp子类有vtkActor(表达场景中的几何数据)和vtkVolume(表达场景中的体数据);二维空间中的数据则是用vtkActor2D表达:vtkProp子类负责确定渲染场景中对象的位置、大小和方向等信息;Prop依赖于两个对象:一个是Mapper(vtkMapper)对象,负责存放数据和渲染信息;另一个是属性(vtkProperty)对象,负责控制颜色、不透明度等参数。另外vtkActor中还可以设置纹理(vtkTexture)对象,用于纹理贴图。
// VTK定义了大量的Prop类,如vtkImageActor(负责图像显示)和vtkPieChartActor(用于创建数组数据的饼图可视化表达形式)。其中有些Prop内部直接包括了控制显示的参数和待渲染数据的索引,因此不需要额外的Property和Mapper对象,例如vtkAxisActor。vtkActor的子类vtkFollower可以自动更新方向信息使其始终面向一个特定的相机,这样无论怎样旋转该对象都是可见的,例如三维场景中的广告板或者文本。
// vtkActor的子类vtkLODActor可以自动改变自身的几何表达形式来实现所需的交互帧率。vtkAssembly建立了各个Actor的层次结构以便在整个结构平移、旋转或缩放等变换时能够更合理地进行控制。
// vtkActor::SetMapper():该方法用于设置生成几何图元的Mapper,即连接一个Actor到可视化管线的末端(Mapper是可视化管线的末端)。
vtkSmartPointer<vtkActor> cylinderActor =
vtkSmartPointer<vtkActor>::New();
cylinderActor->SetMapper( cylinderMapper );
cylinderActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
// vtkRenderer 负责管理场景的渲染过程。组成场景的对象包括Prop,照相机(vtkCamera)和光照(vtkLight)都被整合到一个vtkRenderer对象中。一个vtkRenderWindow中可以有多个vtkRenderer对象,而这些vtkRenderer可以渲染在窗口不同的矩形区域中(即视口)或者覆盖整个窗口区域。
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor( cylinderActor ); // 该方法用于将vtkProp类型的对象添加到渲染场景中
// vtkRenderer::SetBackground():该方法是从vtkRenderer的父类vtkViewport继承的,用于设置渲染场景的背景颜色,用R、G、B的格式设置,三个分量的取值为0.0~1.0。(0.0,0.0,0.0)为黑色,(1.0,1.0,1.0)为白色。除了可以设置单一的颜色之外,还可以设置渐变的背景颜色,vtkViewport::SetBackground2()用于设置渐变的另外一种颜色,但是要使背景颜色渐变生效或者关闭,必须调用以下的方法。
// vtk::Viewport::SetGradientBackground(bool):参数为0时,关闭,反之打开。
// vtk::Viewport::SetGradientBackgroundOn():该方法用于打开背景颜色渐变效果,相当于调用方法vtk::Viewport::SetGradientBackground(1)。
// vtk::Viewport::SetGradientBackgroundOff():该方法用于打开背景颜色渐变效果,相当于调用方法vtk::Viewport::SetGradientBackground(0)。
renderer->SetBackground( 1.0, 1.0, 1.0 );
// 将操作系统与VTK渲染引擎连接到一起。不同平台下的vtkRenderWindow子类负责管理本地计算机系统中窗口创建和渲染过程。当使用VTK开发应用程序时,只需要使用平台无关的vtkRenderWindow类,运行时,系统会自动替换为平台相关的vtkRenderWindow子类。、
// 比如,Windows下运行上述的VTK程序,实际创建的是vtkWin32OpenGLRenderWindow (vtkRenderWindow的子类)对象。vtkRenderWindow中包含了vtkRender集合、渲染参数,如立体显示(Stereo)、反走样、运动模糊(Motion Blur)和焦点深度(Focal Depth)等。
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer( renderer ); // 该方法用于加入vtkRenderer对象
renWin->SetSize( 640, 480 ); // 该方法是从vtkRenderWindow的父类vtkWindow继承过来的,用于设置窗口的大小,以像素为单位。
renWin->Render();
renWin->SetWindowName("RenderCylinder");
// vtkRenderWindowInteractor类提供平台独立的响应鼠标、键盘和时钟事件的交互机制,通过VTK的观察者/命令模式将监听到的特定平台的鼠标、键盘和时钟事件交由vtkInteractorObserver或其子类,如vtkInteractorStyle进行处理。vtkInteractorStyle等监听这些消息并进行处理以完成旋转、拉伸和缩放等运动控制。
// vtkRenderWindowInteractor会自动建立一个默认的3D场景交互器样式(Interactor Style):vtkInteractorStyleSwitch,当然也可以选择其他交互器样式或者创建自己的交互器样式,如vtkInteractorStyleTrackballCamera。
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin); // 该方法用于设置渲染窗口,消息是通过渲染窗口捕获到的,所以必须给交互器对象设置渲染窗口。
// vtkInteractorStyleTrackballCamera是交互器样式的一种。该样式下,用户通过控制相机对物体作旋转、放大、缩小等操作。
// 打个比方,在照相时如果想要物体拍起来显得大一些,可以采取两种做法:第一种做法是相机不动,让要拍的物体靠近相机;第二种做法是物体不动,让相机靠近物体。第二种做法就是vtkInteractorStyleTrackballCamera的风格,其父类为vtkInteractorStyle,除了vtkInteractorStyleTrackballCamera之外,VTK还定义了其他多种交互器样式,如vtkInteractorStyleImage,用于显示二维图像时的交互。
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style); // 该方法用于定义交互器样式,默认的交互器样式为vtkInteractorStyleSwitch。
iren->Initialize(); // 该方法表示为处理窗口事件做准备,交互器工作之前必须先调用这个方法进行初始化。
iren->Start(); // 该方法表示开始进入事件响应循环,交互器处于等待状态,等待用户交互事件的发生。进入事件响应循环之前必须先调用Initialize()方法。
return EXIT_SUCCESS;
}
示例2.1执行效果:
可以将以上示例看作一个舞台剧演出。观看舞台剧时,观众坐在台下,展现在观众面前的是一个舞台,舞台上有各式的灯光和各样的演员。演员出场时肯定是会先化妆,观众有时还会与台上的演员有一定的互动.
整个剧院就好比VTK程序的渲染窗口(vtkRenderWindow) ; 舞台就相当于渲染场景(vtkRenderer) ;而那些 演员就是程序中的Actor ,台上演员与观众互动的方式有很多种,现场的观众可以直接上台与演员们握手拥抱,电视机前的可以法短信,计算机前的可以微博关注等,这就好比程序中的 交互器样式(vtkInteractorStyle) ;对于舞台上的演员,观众都可以一一分辨出来,不会弄混,是因为他们穿着打扮、容貌都不一样,这就相当于程序中 vtkActor的不同属性(vtkProperty) ;台下 观众的眼睛可以看作vtkCamera ,前排观众因为离得近,在观看台上演员时会觉得他们比较高大,而后排的观众因为离得远,所以那些演员看起来就会显得小些,每位观众看到的东西在他/她的世界里都是唯一的,所以渲染场景Renderer里的vtkCamera对象也是只有一个;舞台的灯光可以有多个,所以渲染场景里的vtkLight也存在多个.
最后此篇关于《VTK图形图像开发进阶》第1-2章——一个稍微复杂的VTK程序的文章就讲到这里了,如果你想了解更多关于《VTK图形图像开发进阶》第1-2章——一个稍微复杂的VTK程序的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
前言 最近开始整理笔记里的库存草稿,本文是 23 年 5 月创建的了(因为中途转移到 onedrive,可能还不止) 网页调起电脑程序是经常用到的场景,比如百度网盘下载,加入 QQ 群之类的 我
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是一名优秀的程序员,十分优秀!