vtk教程第六章 基础算法

46 篇文章 19 订阅
12 篇文章 16 订阅

我们已经了解了如何表示基本类型的可视化数据,如图像数据、结构化网格、非结构化网格和多边形数据。本章探讨了将这些数据转换为这些不同表示形式的方法,最终生成我们可以渲染的图形原语。这些方法被称为算法,并且对那些在可视化领域工作的人特别感兴趣。算法是动词,它允许我们以可视化的形式表达数据。通过适当地组合这些动词,我们可以将复杂的数据简化为简单、易于理解的句子,这就是数据可视化的力量。

6.1介绍

转换数据的算法是数据可视化的核心。为了描述各种可用的转换,我们需要根据转换的结构和类型对算法进行分类。通过结构,我们指的是转换对数据集的拓扑和几何结构的影响。类型是指算法操作的数据集的类型。根据结构转换如何影响数据集的几何形状、拓扑结构和属性,

结构转换可以分为四种方式。

•几何变换改变输入几何,但不改变数据集的拓扑结构。例如,如果我们平移、旋转和/或缩放多边形数据集的点,则燃烧室数据集的等值面计算为多个值。162基本算法拓扑结构不会改变,但是点坐标和几何结构会改变。

•拓扑转换改变输入拓扑,但不改变几何和属性数据。将数据集类型从多边形数据转换为非结构化网格数据,或从图像数据转换为非结构化网格,会更改拓扑,但不会更改几何形状。然而,更常见的是,几何形状随拓扑变化而变化,因此拓扑变换并不常见。

•属性转换将数据属性从一种形式转换为另一种形式,或从输入数据创建新属性。数据集的结构不受影响。计算矢量大小或基于高程创建标量是数据属性转换。

•组合转换改变数据集结构和属性数据。例如,计算等高线或曲面就是一个组合变换。

我们还可以根据算法操作的数据类型或生成的数据类型对算法进行分类。通过类型,我们通常是指属性数据的类型,例如标量或向量。

•标量算法对标量数据进行操作。例如,在天气图上生成温度等高线。

•向量算法对向量数据进行运算。显示气流方向箭头(方向和大小)是矢量可视化的一个例子。

•张量算法作用于张量矩阵。张量算法的一个例子是使用定向图标显示材料中的应力或应变分量。

•建模算法生成数据集拓扑或几何,或表面法线或纹理数据。对许多算法来说,建模算法往往是包罗万象的类别,因为有些算法不完全适合上面提到的任何单一类别。例如,根据矢量方向生成字形,然后根据标量值进行缩放,这就是标量/矢量组合算法。为了方便起见,我们将这样的算法归类为建模算法,因为它不完全适合任何其他类别。

算法也可以根据它们处理的数据类型进行分类。这是可视化文献中最常见的方案。然而,这一方案并非没有问题。这些类别经常重叠,导致混淆。例如,一个类别(上面没有提到)是体可视化,它指的是体数据(或者用我们的术语来说,图像数据)的可视化。这个类别最初是创建来描述在体积上排列的标量数据的可视化,但最近,向量(甚至张量)数据已经在体积上可视化。因此,我们必须将我们的技术限定为体积矢量可视化,或其他可能令人困惑的组合。

在下面的文本中,我们将使用属性类型分类方案:标量、向量、张量和建模。在算法操作特定数据集类型的情况下,我们根据最佳判断将它们放在适当的类别中。不过,需要预先警告的是,其他分类方案确实存在,并且可能更适合描述算法的真实性质。

图6-1通过查找表将标量映射到颜色

通用性与效率

大多数算法都可以专门针对特定的数据集类型编写,或者更一般地,可以处理任何数据集类型。特定算法的优点是它通常比可比的通用算法快。(请参阅第138页的“其他数据抽象”,在那里我们讨论了抽象和具体形式之间的权衡。)特定算法的实现也可能具有更高的内存效率,并且其实现可能更好地反映算法与其所操作的数据集类型之间的关系。

其中一个例子是轮廓面创建。提取轮廓曲面的算法最初是为体积数据开发的,主要用于医疗应用。体积的规律性有助于有效的算法。然而,基于容量的算法的专门化阻碍了它们用于更通用的数据集,如结构化或非结构化网格。虽然轮廓算法可以适应这些其他数据集类型,但它们的效率低于体积数据集。

我们对算法的介绍更倾向于更通用的实现。在某些特殊情况下,我们将介绍针对特定数据集类型的性能改进技术。请参阅每章末尾的参考书目,以获得专门算法的详细描述。

6.2标量算法

标量是与数据集的每个点和/或单元相关联的单个数据值。(回想一下,在可视化工具包中,我们将数据与点相关联。)因为标量数据在现实应用程序中很常见,而且标量数据很容易处理,所以有许多不同的算法可以对其进行可视化。

颜色映射

颜色映射是一种常用的标量可视化技术,它将标量数据映射为颜色,并在计算机系统上显示颜色。标量映射是通过索引到颜色查找表来实现的。标量值用作查找表的索引。图6-1通过查找表将标量映射到颜色。

基本算法查找表保存了一个颜色数组(例如,红、绿、蓝组件或其他类似的表示)。与表相关联的是标量值映射到的最小和最大标量范围(min, max)。大于最大范围的标量值被固定为最大颜色,小于最小范围的标量值被固定为最小颜色值。然后,对于每个标量值si,在有n个条目(0偏移量)的颜色表中的索引i如图6 - 1所示。

查找表的一种更通用的形式称为传递函数。传递函数是将标量值映射到颜色规格的任何表达式。例如,图6 - 2将红色、绿色和蓝色分量的标量值映射为单独的强度值。我们还可以使用传递函数将标量数据映射到其他信息,例如局部透明性。(传递函数在第213页的“透明度和Alpha值”和第218页的“体积渲染”中有更详细的讨论。)查找表是传递函数的离散抽样。通过在一组离散点上对传递函数进行采样,我们可以从任何传递函数创建一个查找表。

颜色映射是一种一维可视化技术。它将一条信息(即标量值)映射到颜色规范。然而,颜色信息的显示并不局限于一维显示。我们经常将颜色信息映射到1D、2D或3D对象上。这是增加可视化信息内容的一种简单方法。

用于标量可视化的颜色映射的关键是仔细选择查找表项。图6 - 3显示了四种不同的查找表,用于可视化流体流经燃烧室时的气体密度。第一个查找表是灰度表。灰度表通常能提供更好的结构细节。图6 - 3中的其他三张图片使用了不同的颜色查找表。第二幅使用了从蓝色到红色的彩虹色调。第三个使用了从红到蓝的彩虹色调。最后一个表格使用了一个旨在增强对比的表格。谨慎使用颜色通常可以增强数据集的重要特征。然而,任何类型的查找表都可能夸大不重要的细节或创建可视化工件,因为数据、颜色选择和人体生理之间不可预见的相互作用。

设计查找表既是科学,也是艺术。从实际的角度来看,表格应该突出重要的特性,同时尽量减少不重要或无关的细节。使用固有地包含缩放信息的调色板也是可取的。例如,从蓝色到红色的彩虹标度经常被用来表示温度标度,因为许多人将“蓝色”与低温联系在一起,而“红色”与高温联系在一起。然而,即使是这样的尺度也是有问题的:物理学家会说蓝色比红色热,因为更热的物体会发出更多的蓝光

图6-2红、绿、蓝颜色分量作为标量值的传递函数

图6-3用不同查找表着色的流动密度。左上的:灰度;右上的彩虹

(蓝转红);左下彩虹(红到蓝);右下大对比度(彩虹。tcl)。

(即波长更短)比红色。此外,没有必要将我们自己局限于“线性”查找表。即使标量到颜色的映射已经被表示为线性操作(图6 - 1),表本身也不需要是线性的。也就是说,可以将表设计为使用对数或其他方案增强标量值的微小变化。

可视化还有另一个元素,那就是艺术或美学的品质。良好的可视化代表了有效的信息沟通和美观的表示之间的平衡。虽然在这个大众传媒的时代,信息往往为了形象而牺牲,但提高舒适度,让人类观察者更深入地参与数据的呈现,可以提高传播的有效性。

图6-4等高线值为5的二维结构化网格等高线绘制

对颜色映射的自然延伸是轮廓。当我们看到用数据值着色的表面时,眼睛通常会将类似颜色的区域分割成不同的区域。当我们等高线数据时,我们有效地构建了这些区域之间的边界。这些边界对应于常数标量值的等高线(2D)或曲面(3D)。

2D等高线显示的例子包括用等温线标注的天气图,或用等高线绘制的拓扑图。三维轮廓被称为等值面,可以用许多多边形基元来近似。等值面的例子包括与身体组织(如皮肤、骨骼或其他器官)相对应的恒定医学图像强度。其他抽象的等值面,如流体流动中恒定压力或温度的表面也可以被创造出来。

考虑如图6 - 4所示的2D结构化网格。标量值显示在定义网格的点旁边。轮廓绘制总是首先选择一个标量值,或轮廓值,它对应于生成的轮廓线或曲面。为了生成轮廓,必须使用某种形式的插值。这是因为我们在数据集中有限的点集上有标量值,而我们的轮廓值可能位于点值之间。由于最常见的插补技术是线性的,我们通过沿边缘的线性插补在轮廓表面上生成点。如果一条边在它的两个端点处有标量值10和0,并且如果我们试图生成值为5的等高线,那么边缘插值会计算轮廓线通过边缘的中点。

生成单元格边缘上的点后,我们可以使用几种不同的方法将这些点连接到轮廓中。一种方法是检测边缘交叉(即轮廓线通过边缘),然后“跟踪”这个轮廓线,因为它在单元边界上移动。我们知道,如果一条轮廓边进入一个单元格,它也必须离开一个单元格。跟踪轮廓线,直到它自行关闭或退出数据集边界为止。如果已知只有一个轮廓线存在,那么这个过程就会停止。否则,必须检查数据集中的每条边,以查看是否存在其他等高线。

另一种方法使用分而治之的技术,独立地处理细胞。这是二维的行进方块算法,三维的行进方块[Lorensen87]。这些技术的基本假设是轮廓线只能以有限数量的方式通过细胞。给出单元点标量值的组合,构造一个案例表,枚举单元所有可能的拓扑状态。拓扑状态的数量取决于单元顶点的数量,以及顶点相对于的内外关系的数量等高价值。如果顶点的标量值大于轮廓线的标量值,则认为顶点在轮廓线内。标量值小于轮廓值的顶点被称为轮廓外。例如,如果一个单元格有四个顶点,每个顶点可以在轮廓线的内部或外部,那么轮廓线通过单元格的可能方式有2 4 = 16种。在案例表中,我们不关心轮廓穿过单元格的位置(例如,几何交点),只关心它如何穿过单元格(例如,轮廓在单元格中的拓扑结构)。

图6 - 5显示了一个正方形单元格的16种组合。可以通过将每个顶点的状态编码为二进制数字来计算案例表的索引。对于用矩形网格表示的二维数据,我们可以用4位索引表示16种情况。一旦选择了合适的情况,就可以使用插值计算等高线/单元边缘相交的位置。该算法处理一个单元格,然后移动或前进到下一个单元格。在访问所有单元后,轮廓将完成。综上所述,行进算法进行如下:

1.选择一个单元格。

2. 计算单元格每个顶点的内部/外部状态。

3.通过将每个顶点的二进制状态存储在单独的位中创建索引。

4. 使用索引在案例表中查找单元格的拓扑状态。

5. 计算案例表中每条边的轮廓位置(通过插值)。

这个过程将在每个单元格中构造独立的几何原语。在单元格边界可以创建重复的顶点和边。这些重复可以通过使用特殊的重合点合并操作来消除。注意,沿着每条边的插值应该在相同的方向上进行。否则,数值四舍五入可能会导致生成的点不是精确一致的,并且不会正确合并。

边缘跟踪和移动立方体方法各有优缺点。该算法易于实现。当我们将技术扩展到三维空间时,这一点尤为重要,在三维空间中,等值面跟踪变得更加困难。另一方面,该算法创建的线段和点互不连通,所需的合并操作需要额外的计算资源。跟踪算法可以

图6-5 16种不同的行军方块。深色顶点表示标量值高于轮廓值。案例5和案例10模棱两可。

图6-6三维等值面生成步进立方体案例。利用对称性,256种可能的情况被减少到15种。深色顶点大于所选等值面的值。

实现为每个等高线生成一条单线,避免合并重合点的需要。

如前所述,移动正方形的3D类比是移动立方体。这里有256种不同的标量值组合,假设立方体单元格中有8个点

(即2 .

组合)。图6 - 6显示了使用argu将这些组合减少到15种情况

图6-7用行进三角形或行进四面体来解决矩形晶格上的不明确情况(只显示立方体的正面)。对角线方向的选择可能会导致轮廓表面出现“凸起”。在2D中,对角线方向可以任意选择,但在3D中对角线受到邻居的限制。

对称性。我们使用旋转和镜像的组合来产生拓扑等效的情况。

一个重要的问题是轮廓模糊。仔细观察编号为5和10的移动正方形案例和编号为3、6、7、10、12和13的移动立方体案例,可以发现在某些配置中,单元格可以以多种方式绘制轮廓。(这种模糊性也存在于使用边缘跟踪方法绘制轮廓时。)当相邻边缘点处于不同状态,但对角线顶点处于相同状态时,二维正方形或三维立方体的表面会出现轮廓模糊。

在二维中,轮廓模糊很容易处理:对于每一种模糊情况,我们实现两种可能情况中的一种。对特定情况的选择是独立于所有其他选择的。根据不同的选择,轮廓线可以扩展或中断当前轮廓线,如图6 - 8所示。这两种选择都是可以接受的,因为生成的等高线将是连续且封闭的(或者将在数据集边界处结束)。

在三维空间中,这个问题更为复杂。我们不能简单地选择一个不明确的情况而不考虑其他不明确的情况。例如,图6 - 9显示了如果我们不小心实现两个相互独立的case会发生什么。在这个图中,我们使用了通常的情况3,但用补充的情况取代了情况6。互补情况是通过将“暗”顶点与“光”顶点交换而形成的。(这相当于将顶点标量值从等值面的值上方交换到等值面的值下方,反之亦然。)将这两种情况配对的结果是在等值面上留下了一个洞。

已经采取了几种不同的方法来解决这个问题。一种方法是用四面体镶嵌立方体,并使用行进四面体技术。这是可行的,因为移动的四面体没有不明确的情况。不幸的是,行进四面体算法生成了由更多三角形组成的等值面,并且用四面体对立方体进行镶嵌需要对四面体的方向进行选择。这种选择可能会导致等值面的人为“凸起”,因为沿着表面对角线进行插值,如图6 - 7所示。另一种方法是评估曲面的渐近行为,然后选择连接或断开轮廓的情况。Nielson和Hamann [Nielson91]开发了一种基于这种方法的技术,他们称之为渐近判决器。它是基于对

图6-8选择特定的轮廓case会断开(a)或连接(b)当前轮廓。案例中显示的是正方形行进案例10。

图6-9任意选择移动立方体箱体会导致等值面上出现孔洞。

标量变量在模糊面上的变化。分析决定了等值面多边形的边应该如何连接。

一个简单而有效的解决方案通过添加额外的补充案例来扩展原来的15个移动多维数据集案例。这些情况被设计为与相邻情况兼容,并防止在等值面上产生洞。需要六种互补的情况,对应于移动的立方体情况3、6、7、10、12和13。如图6 - 10所示。

我们可以将行进正方形和行进立方体的一般方法扩展到其他拓扑类型。在VTK中,我们使用移动线、三角形和四面体来绘制这些类型的等值单元格(或由这些类型组成的复合单元格)。此外,尽管我们说的是规则类型,如正方形和立方体,但行进立方体可以应用于拓扑上等价于立方体的任何单元类型(例如,六面体或非立方体体素)。

图6 - 11显示了轮廓的四种应用。在图6 - 11 (a)中,我们可以看到不同组织类型对应的CT密度值的二维等高线。这些线条是用行进方块生成的。图6 - 11 (b)到图6 - 11 (d)是由移动立方体创建的等值面。图6 - 11 (b)是计算机断层扫描(CT) x射线成像系统的恒定图像强度的表面。(图6 - 11 (a)是该数据的2D子集。)强度水平与人体骨骼相对应。图6 - 11 (c)为等流密度等值面。图6 - 11 (d)是铁蛋白分子的电子势等值面。如图6 - 11 (b)所示

图6-10移动多维数据块互补案例

因为我们熟悉人体解剖学,所以一眼就能认出来。然而,对于那些在计算流体力学和分子生物学领域的从业者来说,图6 - 11 (c)和图6 - 11 (d)同样熟悉。正如这些例子所示,轮廓绘制方法是用于可视化来自各种领域的数据的强大而通用的技术。

标量的一代

目前提出的两种可视化技术,即颜色映射和等高线,是简单有效的显示标量信息的方法。在可视化数据时,首先使用这些技术是很自然的。然而,我们的数据通常不是这些技术方便的形式。数据可能不是单值(即标量),也可能是数学关系或其他复杂关系。这就是可视化的乐趣和创造性挑战的一部分:我们必须利用我们的创造性资源将数据转换为我们可以可视化的形式。

例如,考虑地形数据。我们假设数据为x-y-z坐标,其中x和y表示平面上的坐标,z表示海拔高度。我们想要的可视化是根据海拔为地形上色。这需要创建一个颜色地图——可能用白色表示高海拔地区,蓝色表示海平面及以下,用不同深浅的绿色和棕色表示海平面和高海拔之间的海拔。我们还需要标量来索引到颜色图中。这里最明显的选择是提取z坐标。也就是说,标量就是z坐标的值。

通过一般化这个问题,这个例子可以变得更有趣。虽然我们可以很容易地创建一个过滤器来提取z坐标,但我们可以创建一个过滤器来生成高程标量值,其中高程沿任何轴测量。给定一条有方向的直线,从(低)点pl(例如海平面)开始,到(高)点ph(例如山顶)结束,我们计算ele

图6-11轮廓绘制示例(a)用于生成等高线的行进方块(头。tcl);(b)人体骨骼的移动立方体表面

(头骨。tcl);(c)流动密度的移动立方体表面(combIso。tcl);(d)

行军方块表面的铁蛋白(ironPIso。tcl)。

在点上使用点积的变换标量si如图6 - 12所示。标量使用方向线的大小进行标准化,并且可以夹在最小和最大标量值之间(如果需要)。该图的下半部分显示了将该技术应用于夏威夷檀香山地形模型的结果。从深蓝色(水)到黄白色(山顶)的256个查找表用于对该图形进行彩色映射。

可视化的创造性实践的一部分是从可用的技术调色板中为给定的数据选择最佳技术。这通常需要可视化系统的用户进行创造性的映射。特别是,要使用标量可视化技术,我们只需要创建一个关系来生成唯一的标量值。标量映射的其他例子包括数据列表的索引值,计算向量大小或矩阵确定,计算表面电流

图6-12归一化点积计算标量。图的下半部分说明了应用于地形数据的技术

檀香山,夏威夷。tcl)。

性质,或点与点之间的距离。标量生成与颜色映射或等高线相结合,是一种简单而有效的技术,可用于可视化多种类型的数据。

6.3矢量算法

矢量数据是方向和大小的三维表示。矢量数据通常来自于对流体流动的研究,或在检验某一量的导数(即变化率)时得出的结果。

刺猬和定向字形

自然矢量可视化技术是为每个矢量绘制一条有方向的、按比例缩放的线(图6 - 13 (A))。直线从与矢量相关的点开始,并朝着矢量分量的方向。通常,生成的行必须按比例放大或缩小以控制其可视表示的大小。这种技术通常被称为刺猬,因为结果刚毛。

这种技术有许多变体(图6 - 13 (b))。可以添加箭头来表示直线的方向。这些线可以根据矢量大小或其他因素来着色

图6-13矢量可视化技术:(a)有向线;(b)使用定向字形;(c)复向量可视化(complexV.;tcl)。

其他标量(如压力或温度)。此外,可以使用定向的“字形”来代替直线。通过字形,我们指的是任何2D或3D几何表示,如有方向的三角形或锥形。

应用这些技术时应小心。在3D中,通常很难理解矢量的位置和方向,因为它投射到2D图像中。此外,使用大量的向量会使显示变得混乱,使可视化变得毫无意义。图6 - 13 (c)显示了人类颈动脉区域的167000个3D向量(使用定向和缩放线)。较大的矢量位于动脉内部,较小的矢量位于动脉外部,方向随机(测量误差),但幅度较小。很明显,向量场的细节在这幅图上是看不出来的。

缩放字形也会带来有趣的问题。在Tufte所说的“可视化谎言”中,[Tufte83]缩放2D或3D字形会导致外观的非线性差异。物体的表面积随着其比例因子的平方而增加,因此两个大小相差两倍的矢量根据表面积可能会相差4倍。这种缩放问题在数据可视化中很常见,必须非常小心地避免误导查看者。

  • 翘曲

向量数据通常与“运动”相关。运动的形式是速度或位移。显示这种矢量数据的一种有效技术是根据矢量场“扭曲”或变形几何。例如,设想通过变形结构来表示结构在荷载作用下的位移。或者,如果我们正在可视化流体的流动,我们可以通过扭曲插入垂直于流动的直线来创建一个流动轮廓。

图6 - 14给出了两个向量扭曲的例子。在第一个例子中,显示了振动梁的运动。原始未变形轮廓显示在线框。第二个示例显示结构化网格数据集中的扭曲平面。平面根据流动动量被扭曲。在平面变形中,可以清楚地看到相对的前后流动。

图6-14扭曲几何图形显示矢量场;(a)梁位移(vib.tcl);(b)流动动量(velProf.;tcl)。

通常,我们必须缩放矢量场来控制几何失真。太小的扭曲可能看不见,而太大的扭曲会导致结构内翻或自相交。在这种情况下,可视化的查看者可能会丢失上下文,可视化将变得无效。

位移图

物体表面的矢量位移可以用位移图来显示。位移图表示物体在垂直于其表面方向上的运动。物体的运动是由施加的矢量场引起的。在典型的应用中,矢量场是位移场或应变场。

矢量位移图借鉴了第171页“标量生成”中的思想。通过计算每一点的曲面法线与向量的点积,向量转换为标量(图6 - 15 (a))。如果结果为正值,则该点的运动方向与表面法线方向一致(即为正位移)。负值表示运动方向与表面法线相反(即负位移)。

这种技术的一个有用的应用是振动的研究。在振动分析中,我们感兴趣的是结构的特征值(即固有谐振频率)和特征向量(即模态振型)。为了理解模态振型,我们可以使用位移图来表示运动区域。结构中存在由正位移变为负位移的特殊区域。这些是零位移的区域。当在结构表面上绘制时,这些区域表现为所谓的振动模态线。模态线的研究一直是理解模态振型的重要可视化工具。

图6-15矢量位移图(a)通过点积运算将向量转换为标量;

(b)振动板表面图。暗区为节线。明亮的区域显示最大的运动

(dispPlot。tcl)。

矩形梁振动模态线如图6 - 15 (b)所示。图中的振动模态是第二次扭转模态,由交叉模态线清楚地表示出来。(图中的混叠是由于分析网格的粗糙造成的。)为了创建该图,我们将图6 - 15 (a)的过程与一个特殊的查找表结合起来。查找表的中心是深色区域(即对应于零点积),表的开头和结尾是明亮区域(对应于1或-1点积)。因此,法向位移大的区域是亮的,模态线附近的区域是暗的。

  • 即时动画

到目前为止所描述的一些技术可以被认为是在一个小的时间步长上移动一个点或物体。刺猬线是一个点在一段时间内运动的近似值,其持续时间由比例因子给出。换句话说,如果是速度,那么一个点的位移是

这表明了对我们之前的技术的扩展:在许多时间步长中重复地置换点。如图6 - 16所示。从以点C为中心的球体S开始,我们反复移动S以生成如图所示的气泡。眼睛倾向于通过连接气泡来追踪路径,使观察者对该区域的流体流动有一个定性的了解。气泡可以显示为随时间变化的动画(给人一种运动的错觉),也可以显示为多次曝光序列(给人一种路径的外观)。

图6-16点c的时间动画,虽然点与点之间的间距不同,但点与点之间的时间增量是恒定的。

这种方法可能被滥用。一方面,某一点的速度是瞬时的。

一旦我们离开这个点,速度可能会改变。用上面的公式6-1假设速度在整个步骤上是恒定的。通过大的步伐,我们很可能跳过速度的变化。使用较小的步骤,我们将以不同的位置结束。因此,步长的选择是构建矢量场中粒子路径精确可视化的关键参数。

为了计算公式6-1,我们可以将其表示为积分:

虽然这种形式不能解析求解大多数真实世界的数据,它的解可以近似使用数值积分技术。精确的数值积分是一个超出本书范围的话题,但众所周知,积分的精度是步长dt的函数。由于路径是整个数据集的积分,因此单元插值函数的精度以及原始矢量数据的精度对于实现精确解起着重要作用。目前还没有明确的研究将细胞大小或插值函数特征与可视化误差联系起来。但教训是明确的:数值积分的结果必须仔细检查,特别是在大矢量场梯度的区域。然而,与许多其他可视化算法一样,使用矢量积分技术获得的见解在定性上是有益的,尽管存在不可避免的数值错误。

数值积分的最简单形式是欧拉法,

此时的位置是之前位置加上瞬时速度乘以增量时间步长的矢量和。欧拉方法的误差在数量级上,对于某些应用来说不够精确。如图6 - 17所示。速度场描述了围绕中心点的完美旋转。使用欧拉方法,我们发现我们总是发散,而不是生成圆,而是生成螺旋。

图6-17均匀旋转矢量场(a)的欧拉积分(b)和2阶龙格-库塔积分(c)。欧拉方法总是发散的。

在本文中,我们将使用2阶龙格-库塔技术[Conte72]。这由表达式给出

其中速度是用欧拉法计算的。这种方法的误差为。与欧拉方法相比,龙格-库塔技术允许我们以一个额外的函数评估为代价,采取更大的积分步骤。一般来说,这种权衡是有益的,但就像任何数值技术一样,使用的最佳方法取决于数据的特定性质。更高阶的技术也可用,但通常不是必需的,因为更高的精度会被插值函数中的误差或数据值固有的误差抵消。如果你对其他的积分公式感兴趣,请查阅本章末尾的参考文献。

关于准确性的最后一点注意事项。在可视化的感知或计算中所涉及的错误是一个开放的研究领域。上一段中的讨论就是一个很好的例子。在此基础上,利用传统的数值积分参数对流线积分的误差进行了表征。但这种说法有一个问题。在可视化应用中,我们对函数值连续但导数不是连续的单元进行积分。当流线穿过单元边界时,可能会出现标准数值分析无法处理的细微影响。因此,需要为可视化应用扩展标准参数。

积分公式需要从全局坐标反复变换到局部坐标。考虑在向量场的影响下在数据集中移动一个点。第一步是识别包含该点的单元格。这个操作是一个搜索(参见292页的“搜索”),加上一个到本地坐标的转换。一旦找到单元格,下一步就是通过插值单元格点的速度来计算该点的速度。然后对点进行增量重新定位(使用积分公式公式6-4)。然后重复该过程,直到该点退出数据集或遍历的距离或时间超过某个指定值。

这个过程需要大量的计算。我们可以采取两个重要步骤来提高性能。

1.改进搜索程序。有两种不同类型的搜索。最初,粒子的起始位置必须由全局搜索程序确定。一旦在数据集中确定了点的初始位置,就可以使用增量搜索过程。增量搜索是有效的,因为点的运动被限制在单个单元格内,或者最多是跨单元格边界。因此,搜索空间受到很大限制,增量搜索相对于全局搜索更快。

2. 坐标变换。从全局坐标到局部坐标的坐标转换的代价可以减少,如果下列条件之一是正确的:局部坐标系和全局坐标系彼此相同(或因x-y-z平移而不同),或者如果向量场从全局空间转换到局部坐标空间。图像数据坐标系是一个局部坐标与全局坐标平行的例子,因此全局坐标到局部坐标的转换可以大大加快。如果将向量场转换为局部坐标(无论是作为预处理步骤还是逐个单元),则积分可以完全在局部空间中进行。计算出积分路径后,可将积分路径上的选定点转化为全局空间,便于可视化。

流线

以前的时间动画技术的一个自然扩展是在许多时间步长中连接点的位置。结果是一个数值近似的粒子轨迹表示为一条线。借用流体流动研究中的术语,我们可以为矢量场定义三种相关的线表示格式。

•粒子轨迹是流体粒子随时间所追踪的轨迹。

•流线是在特定时间ti之前通过指定点xi的粒子轨迹集。

•流线是沿着满足方程的曲线的积分曲线

在一个特定的时间。

如果流动是稳定的,流线、流线和粒子痕迹彼此等效。在时变流中,给定的流线只在某一时刻存在。可视化系统通常提供计算粒子轨迹的工具。然而,如果时间是固定的,同样的工具可以用来计算流线。一般来说,我们将使用术语流线来指代在向量场中追踪轨迹的方法。如果流量是时变的,请记住这些表示的差异。

图6 - 18显示了一个小厨房里的40条流线。房间有两扇窗户,一扇门(有漏风),还有一个带热炉子的烹饪区。漏风和温度变化结合在一起,在整个厨房产生空气对流。流线的起始位置是通过创建一个耙或曲线(及其相关点)来定义的。这里是耙子

图6-18小厨房流速计算图(俯视图和侧视图)40条流线沿着位于窗下的耙子开始。一些最终通过热炉并向上对流(厨房。cxx)。

一条直线。这些流线清楚地显示了流场的特征。通过同时释放许多流线,我们可以获得更多的信息,因为眼睛倾向于将附近的流线组合成对流场特征的“全局”理解。

流线可视化有许多增强功能。线可以根据速度大小着色,以表明流动的速度。其他标量,如温度或压力,也可以用来给线条上色。我们也可以画出常数时间的虚线。每个破折号代表一个固定的时间增量。因此,在高速度区域,冲刺的长度相对于低速度区域会更大。如图6 - 19所示,这些技术用于钝鳍周围的气流。这个例子包括一个带有半圆鳍的壁面,凸出到流体流动中。(使用对称参数,只有一半的域被建模。)在翅片上游释放了25条流线。从流线上可以清楚地看到翅片与管壁交界处附近的边界层效应。在该区域,流动再循环明显,流速降低。

6.4张量算法

正如我们前面提到的,张量可视化是一个活跃的研究领域。然而,有一些简单的技术,我们可以用来可视化真正的对称张量。这种张量用于描述三维材料中的位移或应力状态。弹性材料的应力和应变张量如图6 - 20所示。

在这些张量中,对角线系数就是所谓的正应力和应变,而非对角线项就是剪应力和应变。正应力和应变垂直于指定的表面,而剪应力和应变则与表面切线。法向应力要么是压缩,要么是拉伸,取决于系数的符号。

图6-19钝鳍周围的虚线流线,每个虚线代表一个固定的时间增量。快速移动的粒子比缓慢移动的粒子产生更长的破折号。流线也由流密度标量(bluntStr.)着色。cxx)。

一个实对称矩阵可以用三维中的三个向量来描述,这些向量被称为特征向量,三个数字被称为矩阵的特征值。特征向量形成一个轴相互垂直的三维坐标系。在一些应用中,特别是在材料的研究中,这些轴也被称为张量的主轴,在物理上具有重要意义。例如,如果张量是应力张量,则主轴是正应力和无剪应力的方向。每个特征向量对应一个特征值。特征值通常在物理上也很重要。在振动研究中,特征值对应结构的谐振频率,特征向量是相关的振型。

从数学上讲,我们可以这样表示特征值和特征向量。给定一个矩阵a,特征向量和特征值必须满足这个关系

为了使公式6-6成立,矩阵行列式必须满足

展开这个方程得到一个n次多项式,它的根是特征值。因此,总是有n个特征值,尽管它们可能不不同。一般情况下,由于计算性能较差,公式6-7不采用多项式根搜索。(对于3阶矩阵,根搜索是可以接受的,因为我们可以解析地求解特征值。)一旦我们确定了特征值,我们可以将它们代入公式6-7来求解相关的特征向量。

我们可以把系统的特征向量表示为

图6-20应力和应变张量。x-y-z坐标方向上的正应力表示为

,剪应力表示为。材料位移用u, v, w分量表示。

sx sy

在特征值方向上有一个单位向量,和系统的特征值。如果我们这样排列特征值

然后我们将对应的特征向量,和称为主特征向量,中特征向量和次特征向量。

张量椭球

这将我们引入张量椭球技术,用于实对称矩阵的可视化。第一步是提取特征值和特征向量,如前一节所述。由于特征向量是正交的,特征向量形成了一个局部坐标系。这些轴可以作为椭球的中轴和长轴。因此,椭球的形状和方向表示特征值的相对大小和特征向量的方向。

为了形成椭球,我们首先在张量位置定位一个球。然后球体使用特征向量围绕其原点旋转,特征向量在方程6-8的形式是方向余弦。特征值被用来缩放球体。利用变换矩阵,参考公式3-6、公式3-9和公式3-13,我们用矩阵T

对以原点为中心的球进行变换,形成椭球(记得从右向左读)。特征向量可以直接插入来创建旋转矩阵,而点坐标x-y-z和特征值则插入到平移和缩放矩阵中。这些矩阵的串联形成最终的变换矩阵t。图6 - 21 (A)描述了张量椭球技术。

在图6 - 21 (b)中,我们展示了这种技术来可视化半无限域表面上的点载荷附近的材料应力。(这是

图6-21张量椭球。(a)沿张量特征值(即主轴)方向的椭球;(b) Boussinesq问题的图像描述;(c)根据Saada的分析结果。

所谓的Boussinesq问题。)根据Saada [Saada74],我们得到了笛卡尔坐标下应力分量的解析表达式,如图6 - 21 (c)所示。请注意,z方向被定义为从施力点p开始的轴。变量是从施力点到x-y-z点的距离。x轴和y轴的方向在垂直于z轴的平面上。(在这些轴的平面上的旋转不重要,因为解是围绕z轴对称的)(参数是泊松比,这是材料的一种性质。泊松比是指在单轴应力条件下材料的横向收缩与轴向伸长之间的关系。参见[Saada74]或[Timoshenko70]了解更多信息。)

图6-22张量可视化技术;(a)张量轴(TenAxes.tcl);(b)张量椭球(TenEllip.)tcl)。

在图6 - 22中,我们可视化了来自Saada的Boussinesq问题的分析结果。图的左侧通过显示应力张量的缩放和定向主轴来显示结果。(这些被称为张量轴。)在右边部分,我们使用张量椭球来显示相同的结果。张量椭球和张量轴是一种专门用于张量可视化的字形(参见190页的“字形”)。

由于在载荷接触点存在应力奇点,因此必须谨慎地将这一结果可视化。在实际应用中,载荷作用于一个小区域,而不是在一个点上。此外,塑料行为可以防止压力水平超过某个点。与任何计算机过程一样,可视化的结果只能与底层模型一样好。

6.5建模算法

建模算法是我们可视化技术分类中的一个包罗万象的类别。建模算法有一个共同点:它们创建或改变数据集几何或拓扑结构。

  • 来源物体

正如我们在前面的例子中看到的,源对象开始可视化管道。源对象用于创建球体、锥体或立方体等几何图形以支持可视化上下文,或用于读入数据文件。源对象也可以用于创建数据集属性。下面是源对象及其使用的一些示例。

简单几何建模球体、圆锥、立方体和其他简单的几何对象可以单独使用,也可以组合使用来建模几何。我们通常会可视化现实世界的应用,比如房间里的气流,并需要显示现实世界的物体,比如家具、窗户或门。现实世界的对象通常可以使用这些简单的几何表示来表示。这些源对象以程序方式生成它们的数据。或者,我们可以使用读取器对象来访问数据文件中定义的几何数据。这些数据文件可能包含更复杂的几何图形,例如由3D CAD(计算机辅助设计)系统生成的几何图形。

支持几何。在可视化过程中,我们可以使用源对象来创建支持几何图形。这可能是简单的三条线来表示一个坐标轴,也可能是复杂的管绕在线段上以增厚和增强它们的外观。另一个常见的用途是作为对象的补充输入,如流线或探测过滤器。这些过滤器接受第二个输入,该输入定义了一组点。对于流线,这些点决定了生成流线的初始位置。探测过滤器使用点作为位置来计算属性值,如标量、向量或张量。

创建数据属性。源对象可以用作创建数据属性的过程。例如,我们可以程序地创建纹理和纹理坐标。另一个用途是在统一的网格上创建标量值。如果标量值是由数学函数生成的,那么我们可以使用这里描述的可视化技术来可视化该函数。事实上,这将我们引向一类非常重要的源对象:

隐式函数。

隐函数隐函数是这种形式的函数

其中c是任意常数。隐函数有三个重要的性质。

•简单的几何描述。隐式函数是描述常见几何形状的方便工具。这包括平面、球体、圆柱、圆锥、椭球和二次曲面。

•区域分离。隐式函数将三维欧几里得空间划分为三个不同的区域。这些区域分别位于隐函数的内、上和外。这些区域分别定义为、、和。

•标量生成。隐式函数将空间中的位置转换为标量值。也就是说,给定一个隐式函数,我们可以在一点上对它进行采样,以生成一个标量值。隐函数的一个例子是半径为R的球的方程

这个简单的关系定义了球体表面的三个区域,

(球内)和(球外)。通过计算公式6-12,任何点都可以在球面内、球面上或球面外进行分类。

图6-23采样函数:(a)球面采样二维描绘;(b)采样球的等值面;(c)两个球体、一个锥体和两个平面的布尔组合。(一个球面与另一个球面相交,两个平面夹持圆锥)(参考球面。tcl和冰淇淋。tcl)

隐式函数有多种用途。这包括几何建模、选择数据和可视化复杂的数学描述。

模拟对象。隐式函数可以单独使用,也可以组合使用来建模几何对象。例如,要对隐式函数描述的曲面建模,我们对数据集上的F进行采样,并在轮廓值ci处生成等值面。结果是该函数的多边形表示。图6 - 23 (b)显示了半径为1的球体在体积上采样的等值面。注意,我们可以选择非零轮廓值来生成一系列偏移曲面。这对于创建混合功能和其他特殊效果很有用。

隐式函数可以结合使用布尔运算符union、intersection和difference来创建复杂的对象。两个函数之间的并集操作,在某一点上为最小值

两个隐函数的交点由

两个隐函数的差值由

图6 - 23 (c)展示了一个简单的隐式函数组合来创建一个冰淇淋蛋筒。锥体是通过用两个平面裁剪(无限)锥体函数而创建的。这种冰淇淋是通过在一个较大的球体和一个较小的偏移球体上执行差值操作来制造“咬一口”的。用等面值曲面轮廓法提取得到的曲面

0.0.

图6-24隐式函数选择数据:(a)选择位于椭圆的二维单元格;(b)使用用于从卷中选择体素的联合操作将两个椭球合并。体素缩小了50%。tcl)。

选择数据。我们可以利用隐式函数的性质来选择和切割数据。特别是,我们将使用区域分离属性来选择数据。(我们把关于删减的讨论推迟到191页的“删减”。)

使用隐式函数选择或提取数据意味着选择函数特定区域内的单元格和点(以及相关属性数据)。为了确定一个点x-y-z是否在一个区域内,我们只需计算这个点并检查结果的符号。如果单元格的所有点都在该区域内,则该单元格位于该区域内。

图6 - 24 (a)显示了一个2D隐式函数,这里是一个椭圆,用于选择其中包含的数据(即点、单元格和数据属性)。布尔组合也可以用来创建复杂的选择区域,如图6 - 24 (b)所示。在这里,两个椭圆组合使用来选择卷数据集中的体素。注意,提取数据通常会改变数据集的结构。在图6 - 24中,输入类型为图像数据集,输出类型为非结构化网格数据集。可视化数学描述。

一些函数,通常是离散的或概率性质的,不能转换为公式6-11的形式。然而,通过应用一些创造性思维,我们通常可以生成可以可视化的标量值。一个有趣的例子就是所谓的奇异吸引子。

奇异吸引子出现在非线性动力学和混沌系统的研究中。在这些系统中,通常类型的动态运动-平衡运动,周期运动,或准周期运动-不存在。相反,系统表现出混沌运动。由于初始条件的微小扰动,系统的结果行为可能发生根本变化。

图6-25通过在体积中积分洛伦兹方程来可视化一个洛伦兹奇异吸引子。

每个体素中的访问次数被记录为一个标量函数。表面通过移动立方体提取,访问值为50。积分步骤的数量是1000万,在2003维度的体积中

. 表面粗糙度是由评价函数的离散性引起的

(洛伦兹。cxx)。

一个经典的奇异吸引子是由Lorenz在1963年开发的[Lorenz63]。洛伦兹建立了一个简单的大气热诱导流体对流模型。对流引起旋转流体环,可由流体流动的一般Navier-Stokes偏微分方程发展而来。洛伦兹方程可以用无维形式表示为

其中x与流体环内流体速度成正比,y和z测量环平面内流体温度,参数和分别与普朗特数和罗利数有关,是一个几何因子。

当然,这些方程不是方程6-11的隐式形式,那么我们如何将它们形象化呢?我们的解决方案是将变量x、y、z作为三维空间的坐标,将公式6-16积分得到系统“轨迹”,即系统随时间的状态。集成是在一个卷内进行的,通过计算每个体素被访问的次数来创建标量。通过积分足够长的时间,我们可以创建一个表示奇异吸引子“表面”的体积,如图6 - 25所示。通过使用移动立方体和指定体素中访问次数的标量值来提取奇异吸引子的表面。

图6-26到点、直线和三角形的距离函数。

在上一节中,我们看到了如何使用隐式函数或隐式函数的布尔组合来建模几何对象。基本方法是在一个规则的点数组或体积上计算这些函数,然后在体积中的每个点上生成标量值。然后使用体绘制(参见第218页的“体绘制”),或结合曲面绘制的等值面生成来显示模型。

这种方法的扩展称为隐式建模,类似于用隐式函数建模。不同之处在于,标量是使用距离函数而不是通常的隐式函数生成的。距离函数计算为到一组生成原语(如点、线或多边形)的欧氏距离。例如,图6 - 26显示了到点、线和三角形的距离函数。因为距离函数是表现良好的单调函数,我们可以通过指定不同的等值面值来定义一系列偏移曲面,其中的值是到生成原语的距离。等值面的形式近似于真实的偏置曲面,但使用高体积分辨率,我们可以获得满意的结果。

单独使用生成基元时,它们对复杂几何建模的能力是有限的。然而,通过使用原语的布尔组合,复杂的几何图形可以很容易地建模。布尔运算的并、交、差(分别为公式6-13、公式6-14和公式6-15)如图6- 27所示。图6 - 28显示了应用隐式建模对文本符号“HELLO”中的线段进行“加粗”。等值面是在一个体积上以0.25个单位的距离偏移量生成的。生成基元使用布尔联合运算符进行组合。虽然欧几里得距离总是一个非负值,但是对于有一个outside和一个inside的物体,可以使用带符号的距离函数。负距离是物体内部一点到物体表面的负距离。使用符号距离函数允许我们创建包含在实际曲面中的偏移曲面。

隐式建模的另一个有趣的特征是,当生成等值面时,可以产生多个连接面。这些情况发生在生成的原语形成凹特征时。如图6 - 29所示。如果需要,可以使用373页“连接性”中描述的连接性算法来分离多个表面。

图6-27使用点和线作为生成原语的布尔操作

图6-28加粗笔画字体的隐式建模原来的线条可以在半透明的隐式表面(你好。tcl)。

图6-29凹特征会产生多条等高线/曲面。

字形

字形有时被称为图标,是一种用于可视化各种类型数据的通用技术。字形是受其输入数据影响的“对象”。此对象可以是几何图形、数据集或图形图像。字形可以定向、缩放、平移、变形或以某种方式改变对象的外观以响应数据。我们已经看到了字形的一种简单形式:刺猬是根据点的位置和矢量值定向、平移和缩放的线条。这种方法的一种变体是使用定向锥或箭头。(更多信息请参见173页的“刺猬和定向字形”。)

更精细的符号是可能的。在一项创造性的可视化技术中,Chernoff [Chernoff73]将数据值与人脸的标志性表示结合起来。眉毛、鼻子、嘴巴和其他特征根据财务数据值进行修改。这个有趣的技术

图6-30字形表示人脸模型的表面法线。

字形位置是随机选择的

(spikeF。tcl)。

关于人类识别面部表情的能力。通过将适当的数据值与面部特征相结合,可以快速识别重要数据点。

从某种意义上说,字形代表了可视化过程的基本结果。此外,我们所介绍的所有可视化技术都可以被视为抽象字形类的具体表示。例如,虽然刺猬是矢量字形的明显表现形式,但等值面可以被视为标量数据的拓扑二维字形。Delmarcelle和Hesselink [Delmarcelle95]已经开发了一个基于字形类型的流可视化的统一框架。他们将字形分为三类之一。

•基本图标表示其空间域范围内的数据。例如,一个有方向的箭头可以用来表示表面法线。

•局部图标表示基本信息加上空间域中值的局部分布。由局部曲率着色的曲面法向量是局部图标的一个例子,因为超出基本信息的局部数据被编码。

•全局图标显示完整数据集的结构。等值面是全局图标的一个例子。

这种分类方案可以扩展到其他可视化技术,如矢量和张量数据,甚至是非视觉形式,如声音或触觉反馈。我们发现这种分类方案在设计可视化或创建可视化技术时很有帮助。通常,它提供了表示可能被忽略的数据的方法。

字形示例如图6 - 30所示。小的3D锥在表面上定向,以指示表面法线的方向。类似的方法可以用于显示其他表面属性,如曲率或解剖关键点。

切割

通常我们想要切割带有曲面的数据集,然后在曲面上显示插值的数据值。我们将这种技术称为数据切割或简单的切割。数据切割操作需要两段信息:曲面的定义和要切割的数据集。我们将

图6-31用平面切割结构化格栅切割平面显示为纯阴影。一个k值恒定的计算平面显示在线框中进行比较(cut.tcl)。颜色对应流动密度。切割面不一定是平面:也可以使用隐式函数,如球体、圆柱体和二次曲面。

假设切割面由一个隐式函数定义。切割的一个典型应用是通过一个平面对数据集进行切片,并对标量数据进行彩色映射和/或根据向量值对平面进行扭曲。

隐式函数的一个属性是将一个位置转换为一个标量值(参见185页的“隐式函数”)。我们可以将此属性与轮廓算法(例如,移动立方体)结合使用来生成切面。基本思想是为数据集的每个单元格的每个点生成标量(使用隐式cut函数),然后对表面值进行轮廓化。

切割算法进行如下。对于每个单元格,函数值是通过计算每个单元格点来生成的。如果所有的点都是正的或负的,那么表面就不会切割细胞。然而,如果这些点的值是正的和负的,那么表面就会穿过单元格。我们可以使用细胞轮廓操作来生成等值面。然后可以通过沿切边插值来计算数据属性值。

图6 - 31展示了结构化网格数据集的平面切割。平面以normal(- 0.287,0,0.9579)穿过数据集的中心。为了便于比较,还显示了网格几何的一部分。网格几何形状是网格表面k=9(如图所示)。切面的一个好处是我们可以在(几乎)任意表面上查看数据。因此,数据集的结构并不限制我们如何查看数据。通过为切割算法指定多个等值,

我们可以轻松地通过结构化网格数据集进行多个平面切割。图6 - 32显示了垂直于摄像机视场法线生成的100个切割平面。用0.05的不透明度从后到前渲染平面会产生体渲染的模拟(参见218页的“体渲染”)。

此示例说明了在结构化网格数据集中切割体积数据会生成多边形单元格。类似地,切割多边形数据会产生直线。使用单个平面方程,我们可以从多边形定义的曲面模型中提取“等高线”。图6 - 33显示了从皮肤表面模型中提取的轮廓。在曲面模型中的每个顶点,我们计算平面方程,并将函数值存储为标量值。用46个等高值从1.5到136.5切割数据,得到的等高线相隔3个单位。

图6-32不透明度为0.05的100个切割平面前后渲染以模拟体渲染(PseudoVolumeRendering)。tcl)。

图6-33用一系列平面切割蒙皮的表面模型会得到等高线(cutModel. 3)。tcl)。

为了视觉清晰,线条用管子包裹。

6.6把一切放在一起

流程对象设计算法在可视化工具包中作为流程对象实现。这些对象可以是源、过滤器或映射器(参见85页的“可视化管道”)。在本节中,我们将描述如何实现这些对象。

源设计。源对象没有用于输入和一个或多个输出的可视化数据,如图6 - 34所示。要创建源对象,继承用于指定数据集的类型

图6-34源对象设计。示例是创建球体多边形表示的源对象。

为输出创建流程对象。图6 - 34说明了具体源对象vtkSphereSource的情况。这个类继承自vtkPolyDataAlgorithm,表示它在输出时创建多边形数据。

创建方便对象vtkPolyDataAlgorithm是为了简化子类派生。例如,vtkBYUReader的类型也是vtkPolyDataAlgorithm。vtkSphereSource和vtkBYUReader之间的主要区别是虚拟方法RequestData()的实现。该方法实际创建其输出数据。如果你派生一个源对象,你不需要使它成为任何方便对象(例如,vtkPolyDataAlgorithm)的子类,但是你应该从vtkAlgorithm派生它。

滤波器的设计。Filter对象具有一个或多个输入和一个或多个输出,如图6 - 35所示。(你也可以参考第103页的“管道设计与实现”。)要创建筛选器对象,可以使用继承来指定输入和输出数据对象的类型。图6 - 35演示了具体源对象vtkContourFilter(它实现了移动立方体和其他轮廓绘制技术)。值得详细研究这个对象图,因为它是可视化管道体系结构的基础。

vtkContourFilter的父类是vtkAlgorithm和vtkPolyDataAlgorithm。类vtkPolyDataAlgorithm指定了vtkContourFilter在输出时产生的数据类型(即vtkPolyData)。因为这个过滤器应该接受vtkDataSet的任何子类作为输入,所以它必须重写FillInputPortInformation()方法的超类实现来指定这一点。注意,从vtkPolyDataAlgorithm继承是可选的——这个功能可以直接在vtkContourFilter中实现。这个可选的超类只是一个方便的对象,使类派生更容易一些。

剩下留给vtkContourFilter实现的是它的RequestData()方法(以及构造函数、打印方法和该类特有的任何其他方法)。因此,具有等效继承层次结构的类之间的主要区别在于RequestData()方法的实现。

vtkAlgorithm的子类通过使用FillInputPortInformation()和FillOutputPortInformation()方法强制过滤输入和输出类型。默认情况下,它的子类vtkDataSetAlgorithm接受输入类型vtkDataSet(或多个子类),并在输出时产生一个vtkDataSet。(类型

图6-35 Filter对象设计所示的示例是接收通用数据集作为输入并在输出上创建多边形数据的对象。

图6-35 Filter对象设计所示的示例是接收通用数据集作为输入并在输出上创建多边形数据的对象。

输出的大小由输入的类型决定。)由于vtkDataSet是所有数据类型的基类,因此vtkDataSetAlgorithm的子类将接受任何类型作为输入。专用过滤器派生自其他类。例如,接受多边形数据的过滤器可能来自vtkPolyDataAlgorithm,而接受非结构化网格数据集的过滤器可能来自vtkUnstructuredGridAlgorithm。

我们鼓励您仔细检查源代码,以获得一些筛选器和源对象。体系结构非常简单,您可以快速掌握它。映射器的设计。

Mapper对象有一个或多个输入,没有可视化数据输出,如图6 - 36所示。可视化工具包中有两种不同类型的映射器:图形映射器和写入器。图形映射器将几何结构和数据属性接口到图形库;写入器将数据集写入磁盘或其他I/O设备。

图6-35 Filter对象设计所示的示例是接收通用数据集作为输入并在输出上创建多边形数据的对象。(a)功能模型(b)对象模型vtkAlgorithm vtkPolyDataAlgorithm vtkContourFilter vtkContourFilter vtkDataSet vtkPolyData图6-36 Mapper对象设计显示的图形映射器(例如,vtkPolyDataMapper)

通过图形库原语映射多边形数据。所示写入器(如vtkSTLWriter)将多边形数据写入立体光刻格式。vtkPolyDataMapper vtkMapper (a)功能模型(b)对象模型vtkPolyDataMapper vtkPolyData vtkSTLWriter vtkPolyData vtkDataWriter vtkPolyDataWriter vtkSTLWriter 196基本算法由于映射器以数据集为输入,因此需要类型强制。每个映射器都直接实现这个功能。例如,类vtkPolyDataMapper和类vtkSTLWriter都实现了一个SetInput()方法来强制输入为vtkPolyData类型。其他映射器和写入器会适当地强制输入类型。尽管写入器和映射器不创建可视化数据,但它们都有类似于源和过滤器的RequestData()方法的方法。vtkMapper的每个子类必须实现Render()方法。该方法在呈现过程中由图形系统参与者及其关联的映射器交换。该方法的效果是将其输入数据集映射到适当的呈现库/系统。类vtkWriter的子类必须实现WriteData()方法。此方法导致写入器将其输入数据集写入磁盘(或其他I/O设备)。

颜色映射

是在可视化工具包中使用类vtkLookupTable的实例创建的。这个类允许您使用HSVA(例如,色调、饱和度、值和alpha不透明度值)规范创建一个查找表。虽然我们在第3章讨论了HSV颜色系统,但我们还没有定义alpha不透明度。我们将在第7章中这样做,但在此之前,将alpha值视为对象的不透明度。Alpha值为1表示该对象是不透明的,而Alpha值为0表示该对象是透明的。

生成查找表项的过程是为HSVA定义值对。这些对定义了色相、饱和度、值和不透明度的线性斜坡。当调用Build()方法时,将使用这些线性斜坡生成具有所请求的表项数量的表。或者,vtkLookupTable还允许您直接将颜色加载到表中。因此,您构建的自定义表不能简单地表示为HSVA值的线性斜坡。

为了演示这个过程,我们为HSVA的每个组件指定一个起始值和结束值,然后使用以下c++代码创建一个从蓝色到红色的彩虹查找表。

由于SaturationRange、ValueRange、AlphaRange的默认值和查找表颜色的数量分别为(1,1)、(1,1)、(1,1)和256,因此我们可以将这个过程简化为如下所示

(HueRange的默认值是(0.0,0.6667)-一个红到蓝的颜色表。)

构建一个包含256个条目的黑白查找表

在某些情况下,您可能希望直接指定颜色。您可以通过指定颜色的数量、构建表,然后插入新的颜色来实现这一点。当您插入颜色时,将使用RGBA颜色描述系统。例如,要创建红、绿、蓝三种颜色的查找表,请使用以下c++代码。

可视化工具包中的查找表与图形映射器相关联。如果没有指定表,映射器将自动创建一个从红到蓝的查找表,但如果您想创建自己的表,请使用mapper->SetLookupTable(lut)操作,其中mapper是vtkMapper或其子类的实例。

关于使用查找表的最后几点注意事项。

•映射器使用查找表将标量值映射到颜色。如果没有标量,映射器及其查找表就不能控制对象的颜色。相反,与vtkActor类关联的vtkProperty对象具有此功能。使用vtkProperty的方法actor->GetProperty()->SetColor(r,g,b),其中r,g和b是指定颜色的浮点值。

•如果你想阻止标量着色你的对象,使用vtkMapper的方法mapper->ScalarVisibilityOff()来关闭颜色映射。然后actor的颜色将控制对象的颜色。

•标量范围(即,颜色映射到的范围)由映射器指定。使用映射器方法->SetScalarRange(min, max)。

您还可以派生自己的查找表类型。例如,请查看vtkLogLookupTable。这个特殊的查找表继承自vtkLookupTable。它执行标量值到表项的对数映射,当标量值跨越多个数量级时,这是一个有用的功能。

隐式函数

正如我们所看到的,隐式函数可以用于可视化函数,创建几何图形,以及切割或选择数据集。VTK包括几个隐式函数,包括单个平面(vtkPlane)、多个凸平面(vtkPlanes)、球体(vtkSphere)、锥(vtkCone)、圆柱体(vtkCylinder)和一般二次曲面(vtkQuadric)。类vtkImplicitBoolean允许您创建这些隐式函数原语的布尔组合。其他隐式函数可以通过派生抽象基类vtkImplicitFunction添加到VTK。

图6-37 vtkImplicitFunctio n及其子类的继承结构。

现有的隐式函数继承层次结构如图6 - 37所示。vtkImplicitFunction的子类必须实现Evaluate()和Gradient()两个方法。Evaluate()方法返回函数在(x,y,z)点的值,而Gradient()方法返回函数在(x,y,z)点的梯度向量。

轮廓线

在可视化工具包中使用vtkContourFilter实现标量轮廓。此筛选器对象接受任何数据集类型作为输入。因此,vtkContourFilter处理每一种单元格类型,并且每一种单元格类型必须提供自己的轮廓化方法。

VTK中的轮廓是使用前面介绍的行进立方体算法的变体来实现的。也就是说,轮廓例表与每个单元格类型相关联,因此每个单元格将生成适当的轮廓原语。例如,四面体单元类型实现了“行进的四面体”并创建三角形原语,而三角形单元类型实现了“行进的三角形”并生成线段。

这种安排的含义是vtkContourFilter将根据输入单元格类型的组合生成点、线和面轮廓绘制原语。因此vtkContourFilter是完全通用的。我们已经创建了另一个轮廓过滤器vtkMarchingCubes,它特定于数据集类型的图像数据(特别是3D卷)。这两个过滤器允许我们比较(至少对于这个算法)通用性的代价。

回想一下163页的“通用性与效率”中关于一般算法和特定算法之间权衡的问题。卷数据集在、、和分辨率下的CPU时间对比如图6 - 38所示。该卷是人类头部的CT数据集。调查了三个病例。在第一种情况下,使用了vtkMarchingCubes对象。这个过滤器的输出是三角形加上法线点。在第二种情况下,运行vtkContourFilter。这个过滤器的输出只是三角形。在最后一种情况下,vtkContourFilter与vtkpolydatanorals结合使用(以生成点法线)。组合滤波器的输出也是三角形加上法线点。

使用vtkMarchingCubes对象将执行时间规范化为最小的数据集。结果很清楚:特定对象的性能比一般对象好1.4到7倍,这取决于数据大小和是否计算法线。在较小的数据集上,差异较大。这是因为对于较小的数据集,包含等值面的体素单元与体素总数的比值较大。(通常体素的总数随着分辨率的立方而增加,而包含等值面的体素随着分辨率的平方而增加。)因此,相对于体素的总数,更多的体素在较小的数据集中被处理

图6-38通用性成本比较了三种不同体积的等值面生成。结果显示了两种不同的移动立方体等值面算法的归一化执行时间。专用过滤器是vtkMarchingCubes。一般算法首先是vtkContourFilter,然后结合vtkpolydatanorals。

而不是大数据集。当数据集变大时,更多的体素是“空的”,不被处理。

尽管这些结果并不代表所有的实现或其他算法的行为,但它们确实指出了通用性的代价。当然,专业化也是有代价的。这个成本通常是程序员的时间,因为程序员必须重写代码以适应新的环境和数据。像所有的权衡一样,解决这个问题需要应用程序方面的知识。

vtkContourFilter的使用示例如图6 - 39所示。这个例子取自图4 - 1,这是一个二次函数的可视化。类vtkSampleFunction使用vtkQuadric类对隐式二次函数进行采样。尽管vtkQuadric在数据流方面不参与管道,但它用于定义和计算二次函数。使用vtkContourFilter可以同时生成一条或多条等值线/等值面。如图6 - 39所示,我们使用GenerateValues()方法指定一个标量范围,以及该范围内轮廓的数量(包括初始和最终标量值)。vtkContourFilter生成重复的顶点,因此我们可以使用vtkCleanPolyData删除它们。为了改善等值面的渲染外观,我们使用vtkPolyDataNormals创建曲面法线。(我们将在第9章描述正常生成。)

图6-39轮廓二次函数。管道拓扑、c++代码和结果图像(contQuad。cxx)。

切割

vtkCutter执行所有VTK单元类型的切割。SetValue()和GenerateValues()方法允许用户指定用于切割的多个标量值。vtkCutter需要一个隐式函数,该函数将在数据集中的每个点上求值。然后使用细胞的轮廓方法切割每个细胞。任何点属性都被插入到结果切割顶点。生成的多边形数据的排序顺序可以用SortBy方法控制。默认排序顺序SortByValue()处理每个轮廓值的内循环中的单元格。SortByCell()在内部循环中处理切割值,并生成适合于前后渲染的多边形数据(见图6 - 32)。(排序顺序在第7章讨论的不透明渲染时很有用。)注意这个过滤器与vtkContourFilter的相似之处。这两个对象的轮廓数据集具有多个等等值。vtkCutter使用隐式函数来计算标量值,而vtkContourFilter使用与数据集的点数据相关联的标量数据。

字形

在可视化工具包中,vtkGlyph3D类提供了一个简单而强大的字形功能。vtkGlyph3D是一个接受多个输入的对象的例子(图6 - 40)。用SetInputConnection()方法指定的一个输入定义了一组点和这些点上可能的属性数据。第二个输入由SetSourceConnection()方法指定,它定义了要复制到输入数据集中每个点的几何图形。源的类型是vtkPolyData。因此,任何过滤器、创建多边形数据的过滤器序列或多边形数据集都可以用来描述字形的几何形状。

vtkGlyph3D实例的行为取决于输入数据的性质及其实例变量的值。通常,输入源几何图形将被复制到输入数据集的每个点。几何图形将沿着输入矢量数据对齐,并根据矢量或标量值的大小缩放。在某些情况下,使用法线点而不是向量。此外,缩放也可以打开或关闭。

在图4 - 20的示例中,我们已经看到了如何使用vtkGlyph3D。圆锥体被用作符号,位于球体上的每个点上,沿着球体的表面法线方向。

图6-41 vtkStreamer及其子类的继承结构。

流线

流线和粒子运动需要数值积分来引导一个点通过向量场。我们将在后面的章节中看到的矢量可视化算法也需要数值积分。因此,我们设计了一个对象层次结构,将数值集成过程隔离到单个基类中。基类是vtkStreamer,它负责通过指定长度的向量字段生成粒子路径(表示为经过的时间)。vtkStreamer的每个派生类都利用这种能力在向量场中移动,但实现了自己的特殊表示技术来描述粒子运动。流线(vtkstreamlined)绘制连接线,而质点运动则通过结合vtkStreamPoints的输出和vtkGlyph3D对象来显示。使用vtkGlyph3D,我们可以在vtkStreamPoints创建的粒子路径上的点上放置球体或定向对象,如锥或箭头。vtkStreamer及其子类的继承结构如图6 - 41所示。

vtkStreamer中的集成方法是作为虚函数实现的。因此,可以根据需要对其进行重载。导致重载的可能原因包括实现精度较高或较低的集成技术,或者创建专门用于特定数据集类型的技术。例如,卷中的搜索过程比其他数据集类型快得多,因此,可以构建高效的向量积分技术。

VTK中的矢量集成技术可以适应任何类型的单元。因此,通过任何拓扑维度的单元进行集成是可能的。如果细胞的拓扑维度为2或更小,积分过程将粒子运动限制在曲面(2D)或直线(1D)上。粒子只能通过穿过单元边界离开单元,并移动到邻近的单元,或退出数据集。

摘要过滤器

属性转换在不改变数据集的拓扑或几何结构的情况下创建或修改数据属性。因此,实现属性转换的过滤器(例如,vtkElevationFilter)可以接受任何数据集类型作为输入,并且可以在输出时生成任何数据集类型。不幸的是,由于过滤器必须专门化它们输出的特定类型的数据,乍一看,在输出上创建一般数据集类型的过滤器似乎是不可行的。这是因为类型vtkDataSet是一个抽象类型,必须专门化以允许实例化。幸运的是,这种困境有一个解决方案。解决方案是使用“虚拟构造函数”NewInstance()。尽管c++不允许虚拟构造函数,但我们可以通过创建一个特殊的虚拟函数来模拟它,该函数构造被调用对象的副本。例如,

图6-42抽象过滤器输出数据流描述。输出对象类型与输入类型相同。

如果此函数应用于类型为vtkPolyData的数据集实例,则结果将是该实例的副本(图6 - 42)。(注意,我们使用引用计数来进行复制,避免复制内存。)虚拟构造函数NewInstance()在许多VTK类中实现,包括数据集和单元格。

使用虚拟构造函数,我们可以构造输出抽象数据类型(如vtkDataSet)的过滤器。我们只需对过滤器的输入应用NewInstance()。这将返回一个指针,指向过滤器输出的具体对象。结果是一个通用的筛选器对象,它可以接受任何数据集类型作为输入,并创建通用的vtkDataSet类型作为输出。在VTK中,这个功能已经在抽象类vtkDataSetAlgorithm中实现。

还有其他过滤器实现了这种委托技术的变体。类vtkPointSetAlgorithm类似于vtkDataSetAlgorithm。该类将任何几何结构通过vtkPoints(或子类)的实例显式定义的数据集作为输入,并在输出时生成相同类型的对象(即vtkPointSet)。类vtkMergeFilter结合了来自一个或多个输入数据集的数据集结构和点属性。例如,您可以读取多个文件,并将一个文件中的几何/拓扑与其他文件中的不同标量、向量和法线结合起来。

使用抽象筛选器类型的一个困难是输出类型可能与下游筛选器的输入类型不匹配。例如,vtkElevationFilter的输出被指定为vtkDataSet,尽管输入类型可能是vtkPolyData,并且从前面的讨论中我们知道实际的输出类型将是vtkPolyData。使用筛选器vtkCastToConcrete可以消除这个困难,它允许您在运行时强制转换为适当的输出类型。在本例中,我们将使用vtkCastToConcrete中的GetPolyDataOutput()。在检查转换的有效性之后,该方法将数据集转换返回给vtkPolyData。当然,这个过程需要在请求输出之前设置vtkCastToConcrete的输入。

可视化血液流动

在这个例子中,我们将结合几种不同的技术来可视化人类颈动脉中的血液流动。我们的数据既包含表示血液速度的向量,也包含与速度大小成比例的标量(即速度)。

我们可以通过创建速度等值面来为可视化提供上下文。这个等面线显示了血液流动最快的区域,与动脉的实际表面相似,但不相同。然而,它为我们提供了动脉结构的视觉线索。

我们将使用的第一个矢量可视化技术是生成矢量字形(图6 - 43)。不幸的是,由于点的数量(超过167,000个点),我们不能在每个点上创建字形。这样做会导致混乱,交互速度也会很差。相反,我们将使用两个过滤器来选择可用点的子集。这些过滤器是vtkThresholdPoints和vtkMaskPoints。

vtkThresholdPoints允许我们提取满足某个阈值标准的点。在我们的例子中,我们选择速度大于指定值的点。这消除了大量的点,因为大多数点位于动脉之外,具有较小的速度值。

筛选器vtkMaskPoints允许我们选择可用点的子集。我们使用OnRatio实例变量指定子集。该实例变量表示将选择每个OnRatio点。因此,如果OnRatio等于1,所有的点都将被选中,如果OnRatio等于10,每10个点都将被选中。这种选择可以是均匀的,也可以是随机的。随机点选择是使用RandomModeOn()和RandomModeOff()方法设置的。

在选择原始点的子集之后,我们可以以通常的方式使用vtkGlyph3D过滤器。锥体的方向指示血液流动的方向,其大小和颜色对应速度大小。图6 - 43显示了该可视化的管道、示例代码和结果图像。注意,我们已经使用解释语言Tcl实现了这个示例。如果你想了解更多关于Tcl的信息,请参阅第11章。

在这个例子的下一部分,我们将生成血流速度的流管。我们再次使用速度等值面来为我们提供上下文。流管的起始位置是通过实验数据确定的。由于数据的测量方式和速度场的分辨率,许多拖缆在动脉外移动。这是因为由于数据分辨率的限制,血流的边界层没有被捕获。因此,当血液绕着曲线流动时,有一个速度场的组成部分将血流管引导到动脉外。因此,很难找到产生有趣结果的流管的起始位置。我们结合使用源对象vtkPointSource和vtkThresholdPoints来解决这个问题。vtkPointSource生成以指定半径的球体为中心的随机点。我们只需要为流管的起点找到一个大致的位置,然后生成一个随机种子点云。vtkThresholdPoints用于剔除高流速区域外可能生成的点。

图6 - 44显示了管道、示例Tcl代码和可视化的结果图像。注意等值面是线框中显示的。这提供了背景,但允许我们看到等值面上的流管。

图6-43观察人颈动脉血流。锥形符号表示水流方向和大小。所显示的代码片段来自Tcl脚本thrshldV。TCL并显示矢量符号的创建。

图6-44观察人颈动脉血流。流矢量的流管

(streamV。tcl)。

6.7章节小结

可视化算法将数据从一种形式转换为另一种形式。这些转换可以更改或创建数据集的新结构和/或属性。结构转换改变数据集的拓扑或几何结构。属性转换更改数据集属性,如标量、向量、法线或纹理坐标。

算法是根据它们所操作的数据类型进行分类的。标量、向量和张量算法分别作用于标量、向量和张量数据。建模算法对数据集几何或拓扑、纹理坐标或法线进行操作。建模算法还可能包括复杂的技术,这些技术可能表示不同数据类型的组合。

算法可以针对一般类型的数据进行设计和实现,也可以针对特定类型进行专门化。一般的算法通常比专门的算法效率低。相反,通用算法更灵活,不需要在引入新的数据集类型时重写。

重要的标量算法包括颜色映射和等高线。颜色映射用于将标量值映射到颜色值。轮廓算法创建等值面或等值线,以指示常量标量值的区域。

像刺猬这样的符号对于可视化矢量数据很有用。这些技术受到一次可以显示的字形数量的限制。粒子轨迹或流线是矢量场可视化的另一个重要算法。粒子痕迹的集合可以传达矢量场的结构。

实对称张量可以用它们的特征值和特征向量来描述。张量可以用张量椭球或有向轴来表示。

隐式函数和采样技术可以用来制作几何图形、切割数据和可视化复杂的数学描述。字形是其外观与特定数据值相关联的对象。字形是灵活的,可以创建来可视化各种数据。

6.8参考书目说明

颜色映射在成像、计算机图形学、可视化和人为因素方面是一个被广泛研究的课题。参考文献[Durrett87] [Ware88] [Rheingans92]提供了可用文献的样本。你可能还想了解颜色对感知的生理和心理影响。Wyszecki和Stiles [Wyszecki82]的文本作为介绍性参考。

轮廓绘制技术因其重要性和普及性而被广泛研究。早期技术是为2D数据开发的[Watson92]。三维技术最初是作为轮廓连接方法开发的[Fuchs77] -即在均匀间隔的平面上给定一系列2D轮廓,连接这些轮廓以创建一个封闭的表面。自从引入移动多维数据集以来,已经实现了许多其他技术。(其中包括[Nielson91] [Montani94]和[Durst88])。Livnat等人给出了一个特别有趣的参考。[Livnat96]。他们展示了一种轮廓化方法,添加了一个预处理步骤,可以在接近最佳的时间内生成等值线。

虽然我们几乎没有触及这个话题,但混沌和混沌振动的研究是一个令人愉快的有趣的话题。除了Lorenz [Lorenz63]的原始论文,Moon [Moon87]的书也是一个很好的开始。

基本算法计算机分析人员多年来一直使用二维和三维矢量图[Fuller80]。流线和流带也已应用于复杂流的可视化[Volpe89]。在[Helman90]和[Richter90]中给出了矢量可视化技术的良好参考。

张量可视化技术在数量上相对较少。大多数技术都是面向字形的[Haber90] [deLeeuw93]。我们将在第9章看到更多的技巧。Blinn [Blinn82], Bloomental [Bloomenthal88] [Bloomenthal97]和Wyvill [Wyvill86]是隐式建模的重要贡献者。隐式建模目前在计算机图形学中很流行,用于对“软”或“斑点”对象建模。这些技术简单、功能强大,正被广泛应用于高级计算机图形建模。

6.9参考资料

[亚伯拉罕85]邵氏。行为的几何。航空出版社,圣克鲁斯,加州,1985年。

[Blinn82]林林。代数曲面画法的推广ACM图形学汇刊。1(3): 235-256, 1982年7月。

[杜晓东,王晓东,等。隐式曲面的多边形化计算机辅助几何设计。5(4): 341-355, 1982年11月。

[布卢蒙塔尔,编辑。隐式曲面导论。摩根考夫曼出版公司,旧金山,加州,1997年。

[Chernoff73]切诺夫。“用脸在k维空间中图形化地表示品脱”美国统计协会。68:361 - 368, 1973。[Cline93]李志强,李志强。脑血流与表面解剖的三维相位对比MRI。计算机辅助断层摄影。17(2):173-177,1993。

[Conte72]孔蒂。基本数值分析。麦格劳-希尔图书公司,1972年出版。

[李文杰,李文杰,李文杰,等。局部流场可视化探头在《可视化学报》93年。第39-45页,IEEE计算机协会出版社,洛斯阿拉米托斯,加州,1993年。

[陈国强,李志强,等。流可视化的统一框架科学与工程分析的计算机可视化图形技术。r·s·加拉格尔编著。佛罗里达州博卡拉顿CRC出版社,1995年。

[杜雷特87]杜雷特编。色彩与计算机。文献出版社,波士顿,马萨诸塞州,1987年。

杜斯88]杜斯特。“移动立方体的附加参考。”计算机图形学。22(2): 72 - 73年,1988年

[Fuchs77]傅氏。平面轮廓的最佳曲面重建ACM通信。20(10): 693 - 702年,1977年。

[Fuller80]李志刚,李志刚。计算机生成的三维矢量场显示。计算机辅助设计。12(2): 61 - 66年,1980年。

[李文杰,李文杰,李文杰,等。可视化习语:科学可视化系统的概念模型。《科学计算中的可视化》,g.m. Nielson, B. Shriver, L. J. Rosenblum主编,IEEE计算机协会出版社,第61-73页,1990。[j]李国强。流体流动数据集中矢量场拓扑的表示和显示。科学计算中的可视化。g.m.尼尔森、B.施赖弗、L. J.罗森布鲁姆主编。IEEE计算机学会出版社,第61-73页,1990。

[Livnat96]沈洪伟。结构化和非结构化网格的近似最优等值面提取算法IEEE可视化与计算机图形汇刊。第2卷第1期,1996年3月。

[罗伦森87]李志强,李志强。移动立方体:一种高分辨率三维曲面构建算法。计算机图形学。21(3): 163-169, 1987年7月。

[罗伦泽63]李志强。"确定性非周期流"大气科学杂志。20:130 - 141, 1963。

[中国科学院科学院学报,2006]移动立方体隐式消歧的修正查找表视觉计算机。(10): 353 - 355, 1994。[月亮87]马文。混沌振动。Wiley-Interscience,纽约,纽约,1987年。

[Nielson91]李国强。《渐近决定器:解决移动立方体中的模糊性》在《可视化学报》91年。第83-91页,IEEE计算机协会出版社,Los Alamitos, CA, 1991。

[莱茵出版社]定量数据显示的颜色、变化和控制在《可视化学报》92年。第252-259页,IEEE计算机协会出版社,Los Alamitos, CA, 1992。

[Richter90]李志强,李志强。流动模拟的可视化。科学可视化与图形仿真。D.塔尔曼主编,约翰·威利父子,1990年,第161-171页。

[Saada74]李志强。弹性理论与应用“,”佩加蒙出版社,纽约,纽约,1974年。

[季莫申科70]李志刚。弹性理论,3d版。麦格劳-希尔图书公司,纽约,纽约,1970年。21基本算法[j]。定量信息的可视化显示。图形出版社,柴郡,康涅狄格州,1990年。

[footnoteref: 1]李志强。"空气动力学中的流线和流带"技术报告AIAA-89-0140,第27届航空航天科学会议,1989。

[Ware88]单变量地图的颜色序列:理论、实验和原则IEEE计算机图形学与应用。8(5): 41-49, 1988年。[沃森92]李文杰。轮廓:空间数据分析和显示指南。佩加蒙出版社,1992年出版。

[韦泽基82]李国强。色彩科学:概念和方法,定量数据和公式。约翰·威利和他的儿子,1982年。

[j]李国强,李国强。软对象的数据结构视觉计算机。2(4): 227 - 234年,1986年。

6.10运动

6.1绘制行进三角形轮廓箱。有多少病例?

6.2行进四面体轮廓箱示意图。有多少病例?

6.3一种常见的可视化技术是将等值面的值动画化。该程序是在指定范围内平滑地改变等值面的值。a)为二次曲线的例子创建一个动画序列(图4 - 1)。b)为头部序列创建一个动画序列(图6 - 11 (b))。

6.4在算法执行过程中,行进的立方体访问每个单元格。许多这些细胞不包含等面。描述一种通过消除对不含等值面的单元的访问来提高等值面的提取性能的技术。(提示:使用预处理步骤来分析数据。假设将提取许多等值面,并且预处理步骤将不计入执行时间。

6.5扫描线栅格化在图形硬件中沿水平跨度进行(参见54页的“栅格化”)。颜色的插值也发生在水平跨度上。a)显示多边形的方向如何影响插值颜色。b)讨论视向依赖的可视化观察所引起的潜在问题。

6.6编写程序模拟梁的振动。使用与图6 - 14 (a)相关的代码作为起点。

6.7使用筛选器vtkstreamlined、vtkMaskPoints和vtkGlyph3D,沿着流线创建由定向字形组成的可视化。

6.8可视化以下功能。a) Scalar . sxyz (),, = sin ()xy, for x,y between 0 and pc)燃烧室数据(即combq.bin和combxyz.bin)中描述的矢量场。

6.9张量椭球基于椭球形符号。描述另外两个你可能使用的符号。

6.10编写一个源对象来生成一个环面的多边形表示。

6.11设计一个字形来传达飞机的航向、速度、高度以及与其他飞机的接近程度(即距离)。

6.12变形是在两个已知的图像或几何图形之间平滑地混合图像(2D)或几何图形(3D)的过程。使用隐式建模方法,如何将环面变形为立方体?

6.13描述一种通过彩色地图动画来可视化矢量信息的技术。(提示:通过仔细选择地图,你可以在一个表面上给人一种运动的错觉。)

6.14不同值的等值线通常在一张图像中同时显示。a)描述同时显示等值面的优点和缺点。b)你可以调整哪两个图形属性来改善多个等值面的显示?

6.15描述一种移动立方体的并行算法。使用您选择的并行体系结构。

6.16分解可以大大提高操作的速度。a)证明三维高斯平滑可以分解为三个一维操作。b)给出分解后的滤波器和同样的滤波器实现为三维卷积的复杂度。c)在什么条件下常数平滑可以分解为一维操作

本书为英文翻译而来,供学习vtk.js的人参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值