在Tcl和C 界面使用用VTK库可视化大型数据集外文翻译资料

 2022-12-26 19:00:45

英语原文共 17 页,剩余内容已隐藏,支付完成后下载完整资料


在Tcl和C 界面使用用VTK库可视化大型数据集

Fre′de′ric Magoule`s,Roman Putanowicz

摘要:本文介绍了在Tcl和C 中使用VTK库和组件编写的大型数据集可视化构建应用程序的技术。VTK是用于计算机图形学,可视化和图像处理的软件系统。 VTK库是用C 编写的,然而它提供了脚本语言Tcl,Python和Java的接口。 虽然可以使用像Tcl这样的脚本语言写一个完整的VTK应用程序,但考虑到效率问题,VTK更合适的是在C/C 这样的编译语言中实现一些功能。本文详细介绍了如何访问来自不同语言的VTK对象以及如何在一个应用程序中混合Tcl和C 组件。

关键词:图像处理;可视化;大规模数据;多语言编程;脚本语言

1 介绍

科学可视化已经成为从科学仪器和模拟产生的大量数据中提取信息的重要工具。近十年来,为了处理图像处理中的大数据集,已经进行了多项研究。本文致力于研究一种通过多语言编程实现大规模数据的高效快速可视化的方法论。更准确地说,本文介绍了将C 和Tcl接口调用混合到Visualization Toolkit(VTK)时遇到的一些问题的解决方案。VTK是用于可视化,计算机图形和成像的开源软件系统。它作为C 库提供了解释语言Tcl,Python和Java的接口。面向对象的设计,高级接口和编写脚本组件的可能性使其成为无论是几行脚本还是复杂的可视化系统都能广泛应用的极好工具。

在计算声学的背景下[10,11],VTK可以用作可视化引擎,Tcl / Tk,Tcl / Tk及其扩展包(例如BLT,Iwidgets)可用于图形用户界面和作为连接组件的脚本“粘合”,如用C 和Fortran编写的几何建模器,网格生成器,有限元求解器。通过在C 或Tcl中编写新的组件可以扩展VTK功能,这中间没有太多问题。然而,当尝试使用调用C 和Tcl接口的可编程进程对象时(即,一个进程对象在Tcl脚本中创建,但其Execute方法是用C 编写的),就出现了如何在这两个接口之间传递信息的问题。由于以往的文献对于这方面的问题没有过多的研究,并且问题的解决需要通过一些源代码实现,因此本文详细讨论了该问题及其解决方案。本文所提出的方法同时考虑了效率和目的因素,可能有利于今后开发者对于大型数据集的可视化处理。

本文的结构如下。首先,介绍了VTK中使用的可视化管道架构。这个主题在参考文献中有详细的介绍,所以只给出必要的概述。下一节描述可编程过程对象,如过滤器和源。这样的对象使得添加用户指定的算法非常简单,但是当在混合语言设置中使用时,它们是引发问题的因素。接下来的两节将介绍如何在C 和Tcl中编写可编程过滤器。有关这些语言编程的更多信息可以分别在其他文献中找到。这些部分的示例将在以下章节中使用,其中描述了如何使用C 编写的方法在Tcl中使用可编程过滤器。首先给出如何向Tcl解释器添加新命令的一些概述,然后讨论Tcl的VTK接口,最后给出一个完整的例子。在文章的结尾,提供了一些结语和参考文献。

2 可视化管线

在使用VTK编写的程序中,可以通过所谓的可视化流水线或可视化网络的数据流来描述可视化过程。可视化管道由称为过程对象的处理单元组成。过程对象对输入数据进行操作并将其转换为输出数据。可视化管道的一个例子如图1所示。

过程对象可以分为三类:源,过滤器和映射器。 源对象没有输入,并且至少有一个输出。 滤波器具有至少一个输入和一个输出,并且映射器具有至少一个输入但不输出。 VTK提供了丰富的过程对象,可以从中构建复杂的可视化算法。 希望更多地了解VTK中使用的可视化流程和可视化管道技术的读者可以参考其他论文。

图1 VTK可视化管线

3 编程对象

尽管向VTK添加新类的进程对象并不是那么困难,但是有一种简单的方法来引入新的进程对象。 VTK提供了一组可编程源和过滤器,如表1所列。

上述各类提供了管理可视化流水线内的对象所必需的所有方法(即设置输入和输出的方法,控制修改时间,调用执行方法等)。与vtkShrinkFilter类似的“普通”过滤器1进行比较时的区别是Execute()方法的操作是通过提供用户指定的函数来指定的。使用可编程过滤器的增益在于不需要导出新类或重建VTK库。可编程过滤器可以用VTK(即,Tcl,Python和Java)支持的所有解释语言使用,并具有用相应语言编写的用户功能。可编程滤波器可用于各种任务,例如以传统格式读取和写入数据,将数据传递到诸如有限元包之类的计算模块,实现新的可视化算法。

在C 或完全在Tcl中使用可编程过滤器相对容易。据了解,C 中创建一个过滤器,其Execute方法用C 编写,或者在Tcl中创建一个过滤器,其Execute方法是用Tcl编写的。

一个更复杂的任务是混合C 和Tcl,即在Tcl中创建一个过滤器,但在C 中编写它的Execute方法。有几个原因为什么这样做。第一个原因是当Tcl中编写可视化软件时,虽然Tcl具有足够的效率来控制应用程序,但编写复杂的过滤算法可能太慢了。当处理例如三维网格的大规模数据时,这一点变得有问题。例如,当分析由飞机在城市产生的噪声水平分布时,考虑大数据集,如图1和2所示。对于这样一个例子,将Tcl和C 组件混合到VTK库允许物理现象的快速和互动的可视化。

第二个原因是,即使一个应用程序是完全用C 开发的,可以独立测试过滤器的算法并且在Tcl中测试脚本似乎是一个完美的解决方案。

所有其余部分作为详细的“如何做”描述在混合Tcl / C 设置中使用可编程滤波器。所有示例使用最通用的可编程滤波器类,即vtkProgrammableFilter。

表1 VTK过滤器

过滤器名称

描述

vtkProgrammableFilter

一般用户可编程过滤器

vtkProgrammableAttributeDataFilter

通过用户指定的功能操纵属性(单元格和点)数据

vtkProgrammableGlyphFilter

在输入点控制字形的生成和放置

vtkProgrammableSource

通过用户指定的功能生成数据集

vtkProgrammableDataObjectSource

通过用户指定的功能生成源数据对象

图2 城市示例

图3 城市噪声水平分布示例(噪音是由飞机A340飞过城市造成的)

4 C 中的可编程过滤器

关于vtkProgrammableFilter类的讨论将以一个使用C 代码的例子开始。这个例子允许显示类的一些内部工作,以便于尝试在Tcl中使用vtkProgrammableFilter时,了解哪些是必需的。

4.1 简单可视化管道示例

为了简化讨论和示例,提出了可视化管道已经被减少到最小并且仅由两个对象组成的程序。管线如图4所示。程序如下:

可以很容易地看到,该程序没有任何其他的东西,只能将“oldmesh.vtk”文件复制到“newmesh.vtk”中。

图4 简单可视化管线

4.2 带过滤器的可视化管道

现在引入了可编程滤波器,以便通过用户指定的功能来转换非结构化网格。程序的布局如图5所示。

图5 带过滤器的可视化管道

假设数据文件包含点的标量属性。用户函数复制网格拓扑和几何,并设置新的点属性,它们是旧的乘以10。利用用户功能,如上所述,最好使用vtkProgrammableAttributeDataFilter,但是这里使用vtkProgrammableFilter来显示如何创建新的输出对象以及如何复制网格拓扑和几何。vtkProgrammableFilter类提供了以下方法:

vktProgrammableFilter::SetExecuteMethod (void(*f)(void *), void *arg)

该方法有两个参数,指向用户函数的指针和指向客户端数据的指针。用户函数必须使用一个void指针类型的参数,并返回void。第二个参数,指向客户端数据的指针将在执行时传递给用户函数。客户端数据允许将用户功能的所有必要信息传递给用户执行其任务。客户端数据通常包含指向过滤器本身的指针,该指针允许函数检索过滤器的输入和输出对象。在最简单的情况下,客户端数据将是指向过滤器的指针。

如果过滤器将使用void ScaleBy10 (void *arg);功能,则新程序将变为:

注意行14,如前所述,将指向过滤器对象的指针作为客户端数据传递。

4.3 用户功能

用户功能ScaleBy10的目的是创建一个与输入网格具有相同几何和拓扑的新网格,但点标量属性按10倍进行缩放。首先将拓扑和几何从输入到复制到输出对象。然后提取点数据阵列,并复制它。复制的数组被修改并作为新的点数据插入到输出网格中。用户功能的代码如下:

在第15行中,检索客户端数据中指向过滤器的指针。在17-20行中,获得过滤器输入和输出,并完成网格几何和拓扑的复制。第22-29行包含将标量属性复制为双精度数组并修改数组的代码。最后在行31中,将修改后的数组作为输出对象中的点数据进行设置。

5 TCL中的过滤器

在本节中,使用与上一节相同的例子,在Tcl中通过可编程滤波器修改数据:

该示例看起来类似于C ,尽管有一个重要的区别,即仅使用一个参数调用过滤器方法SetExecute-Method:

filter SetExecuteMethod ScaleBy10

必须使用一个参数来调用它,因为第二个参数是由SetExecuteMethod的Tcl包装器隐式提供的,并且此参数设置为指向Tcl解释器的指针。 vtkProgrammableFilter对象需要该指针来评估用户提供的Tcl脚本。 上面提出了用户提供的脚本将如何获取其客户端数据并在其过滤器中的问题。为了解决这个问题,必须使用Tcl中可用的一些其他数据传递机制。 客户端数据可以通过全局变量或通过使用命名空间变量机制传递。 在所提供的示例中,使用在全局名称范围中创建过滤器的事实,并且与其相关联的命令过程可在各处使用。

6 Tcl中的可编程过滤器结合C 中的方法

在上一节的例子中,用户函数ScaleBy10是用脚本语言编写的。现在要做的是使用C 编写的用户函数来保持前一个例子完好。有这样做的原因是:首先是提高效率,第二,用户功能代码的很大一部分可能已经需要使用另一种语言编写了。

在给出配方之前,如何实现上述目标,有必要使用新的内置命令来扩展Tcl应用程序。这个问题在参考文献中有很好的描述,但一个简短的例子将使以下讨论更加完整。因此还需要了解VTK库的一些内部工作。但是必须引用源代码本身,特别是以下文件:

Common/vtkTclUtil.h,

Common/vtkTclUtil.cxx,

Graphics/vtkProgrammableFilter.cxx,

Graphics/vtkProgrammableFilterTcl.cxx.

6.1 向Tcl解释器添加新的内置命令

可以通过在C.2中编写新的命令实现来轻松扩展Tcl。新命令可以在C中实现,以提高效率,或提供Tcl中不能提供的功能。

下面的示例介绍了Add命令的实现,它添加了两个数字,并返回了添加的结果。 以下是Tcl实现的样子:

要在C中实现Tcl命令,必须提供一个名为命令过程的C函数。 此函数解析命令参数,执行命令操作并创建命令结果。 在前面的例子中,将使用基于所谓的“双端口对象”的命令过程接口。 那些“对象”是Tcl_Obj类型的结构,并在Tcl 8.0中引入,以最小化字符串和数据的本机表示之间的转换次数。 每个命令过程都有一个标准接口。 对于上一个示例的Add命令,它的实现方法如下:

int AddObjCmd(ClientData clientData, Tcl_Interp *interp,

int objc, Tcl_Obj *CONST objv[]);

第一个参数允许将任意客户端数据传递给命令过程。第二个是Tcl解释器,第三个是传递给命令的参数数(包括命令名),第四个是数组,参数值表示为Tcl_Objobjects,该函数返回一个指示成功或失败的整数。 这是AddObjCommand的一个实现方法:

在行8-13中,检查是否使用适当数量的参数来调用命令。在第15-23行中,获取了通过ascommand参数的对象的值。在第25行中,函数AddVeryFast被调用,在第26行中,结果对象被创建,然后被设置为该命令的结果。

此示例仅涉及C中创建命令过程的问题。Tcl API(应用程序接口)提供了几个功能来协助编写命令过程(支持列表,哈希表,脚本评估,变量、跟踪等)。

创建命令过程只是作业的一半。必须向Tcl通知新命令,以便每当在过程调用上下文中遇到命

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[28092],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。