Main Content

可视化向量三维体数据

流线、流粒子、流带、流、流管和圆锥

向量三维体数据比标量数据包含更多的信息,因为数据集中的每个坐标点都有三个关联的值。这些值定义了表示模和方向的向量。液体流速就是向量数据的一个示例。

有许多方法可用于可视化向量数据:

  • 流线跟踪沉浸在向量场中的无质量粒子的轨迹。

  • 流粒子是跟踪流线的标记,可用于制作流线动画。

  • 流带类似于流线,只不过它们可以借助带的宽度指示扭曲。流带可用于指示旋度角速度。

  • 流管类似于流线,但您也可以控制管的宽度。流管可用于显示向量场的散度。

  • 圆锥图通过显示圆锥形箭尖或普通箭尖来表示每个点处数据的模和方向。

通常,这些函数要与其他可视化方法(如等高线、切片平面和等值面)结合使用,才能最好地表现数据。本节中的示例说明了其中一些方法。

对向量数据使用标量方法

等高线切片、切片平面和等值面等可视化方法需要标量三维体数据。通过获取向量的模,您可以将这些方法用于向量数据。例如,wind 数据集返回三个坐标数组和三个向量分量数组 uvw。在这种情况下,速度向量的模等于三维体中每个对应坐标点处的风速。

wind_speed = sqrt(u.^2 + v.^2 + w.^2);

数组 wind_speed 包含三维体数据的标量值。但是,这种方法产生的信息是否有用取决于向量数据的模表示什么样的物理现象。

指定流线图的起点

流线图(流线、流带、流管以及圆锥体或箭头)描绘三维向量场的流动。MATLAB® 流绘图函数(streamlinestreamribbonstreamtubeconeplotstream2stream3)都需要您指定每个流跟踪的起点。

确定起点

一般而言,了解数据的特性有助于您选择起点。主要流向以及数据坐标范围等信息可以帮助您决定在何处计算数据。

streamslice 函数对于研究数据非常有用。例如,下面这些语句绘制了向量场范围中间某个 z 值处的切片。

load wind
zmax = max(z(:)); zmin = min(z(:));
streamslice(x,y,z,u,v,w,[],[],(zmax-zmin)/2)

这个流切片图指明流的方向为正 x,并且您可以在 xy 方向选择起点。您可以在 x-z 平面或 y-z 平面创建类似的三维体切片图,以便深入了解数据的范围和方向。

指定起点坐标数组

要指定一条流线的起点,您需要知道该点的 xyz 坐标。meshgrid 命令为创建起点数组提供了便捷的途径。例如,您可以从上一个流切片图显示的风数据中选择以下起点。

[sx,sy,sz] = meshgrid(80,20:10:50,0:5:15);

此语句将起点定义为全部位于 x = 80 处,y 的范围从 20 到 50,z 的范围从 0 到 15。您可以使用 plot3 显示这些位置。

plot3(sx(:),sy(:),sz(:),'*r');
axis(volumebounds(x,y,z,u,v,w))
grid on 
set(gca,'BoxStyle','full','Box','on')
daspect([2 2 1])

您不需要使用三维数组(比如 meshgrid 返回的数组),但每个数组的大小必须相同,而 meshgrid 的便捷之处在于它可以在各个坐标的唯一值数量不同时生成数组。您还可以将起点数组定义为列向量。例如,meshgrid 将返回三维数组:

[sx,sy,sz] = meshgrid(80,20:10:50,0:5:15);
whos
  Name      Size             Bytes  Class     Attributes

  sx        4x1x4              128  double              
  sy        4x1x4              128  double              
  sz        4x1x4              128  double      

此外,您还可以使用 16×1 列向量,由三个数组的相应元素构成每个起点的坐标。(相当于将 meshgrid 返回的值索引为 sx(:)sy(:)sz(:)。)

例如,在起点后面添加流线,将生成:

streamline(x,y,z,u,v,w,sx(:),sy(:),sz(:))

访问三维体数据的子区域

subvolume 函数为访问三维体数据集的子区域提供了简便的方法。subvolume 允许您根据范围选择感兴趣的区域,而不用使用冒号运算符对定义三维体的三维数组进行索引。请考虑以下两种创建子三维体数据的方法 - 使用冒号运算符进行索引,以及使用 subvolume

使用冒号运算符进行索引

当您对数组进行索引时,您处理的是值,它们指定数组每个维度的各个元素。

load wind
xsub = x(1:10,20:30,1:7);
ysub = y(1:10,20:30,1:7);
zsub = z(1:10,20:30,1:7);
usub = u(1:10,20:30,1:7);
vsub = v(1:10,20:30,1:7);
wsub = w(1:10,20:30,1:7);

使用 subvolume 函数

subvolume 允许您使用可从坐标区读取的坐标值。例如:

lims = [100.64 116.67 17.25 28.75 -0.02 6.86];
[xsub,ysub,zsub,usub,vsub,wsub] = subvolume(x,y,z,u,v,w,lims);

然后您可以使用子三维体数据作为需要向量三维体数据的任何函数的输入。