1.使用向量数据显示流线图
MATLAB® 向量数据集 wind
代表北美地区的气流。本示例结合使用了几种方法:
-
利用流线跟踪风速
-
利用切片平面显示数据的横截面视图
-
利用切片平面上的等高线提高切片平面着色的可见性
1.1确定坐标的范围
加载数据并确定用来定位切片平面和等高线图的最小值和最大值(load、min、max)。
load wind
xmin = min(x(:));
xmax = max(x(:));
ymax = max(y(:));
zmin = min(z(:));
1.2 添加切片平面以提供视觉环境
计算向量场的模(代表风速),以生成用于 slice 命令的标量数据。沿 x 轴在 xmin
、100
和 xmax
处、沿 y 轴在 ymax
处以及沿 z 轴在 zmin
处创建切片平面。指定插补面着色,以切片颜色指示风速,但不绘制边(sqrt、slice、FaceColor、EdgeColor)。
wind_speed = sqrt(u.^2 + v.^2 + w.^2);
hsurfaces = slice(x,y,z,wind_speed,[xmin,100,xmax],ymax,zmin);
set(hsurfaces,'FaceColor','interp','EdgeColor','none')
colormap turbo
1.3 在切片平面上添加等高线
在切片平面上绘制浅灰色等高线以帮助量化颜色映射(contourslice、EdgeColor、LineWidth)。
hcont = ...
contourslice(x,y,z,wind_speed,[xmin,100,xmax],ymax,zmin);
set(hcont,'EdgeColor',[0.7 0.7 0.7],'LineWidth',0.5)
1.4 定义流线的起点
在本示例中,所有流线都从 x 轴上的值 80 处开始,在 y 方向上的范围为 20 到 50,在 z 方向上的范围为 0 到 15。保存流线的句柄并设置线宽和颜色(meshgrid、streamline、LineWidth、Color)。
[sx,sy,sz] = meshgrid(80,20:10:50,0:5:15);
hlines = streamline(x,y,z,u,v,w,sx,sy,sz);
set(hlines,'LineWidth',2,'Color','r')
1.5 定义视图
设置视图,扩展 z 轴以便于观察图形(view、daspect、axis)。
view(3)
daspect([2,2,1])
axis tight
2.利用流带显示旋度
2.1流带可以显示哪些信息
与流线类似,流带可以表明流的方向,但通过扭曲带状流线,流带还可以显示围绕流坐标轴的旋转。streamribbon 函数允许您为流带中的每个顶点指定扭曲角度(以弧度为单位)。
与 curl 函数结合使用时,streamribbon
可用于显示向量场的旋度角速度。下例演示了这一技术。
2.2选择要绘制的数据子集
加载 wind
数据集并使用 subvolume 选择关注区域。先绘制完整数据集可以帮助您选择关注区域。
load wind
lims = [100.64 116.67 17.25 28.75 -0.02 6.86];
[x,y,z,u,v,w] = subvolume(x,y,z,u,v,w,lims);
2.3计算旋度角速度和风速
计算旋度角速度和风速。
cav = curl(x,y,z,u,v,w);
wind_speed = sqrt(u.^2 + v.^2 + w.^2);
2.4创建流带
-
stream3 以
.5
为步长计算流线顶点。 -
streamribbon 按因子
2
缩放流带宽度,以提高扭曲(表明旋度角速度)的可见性。 -
streamribbon
返回它创建的曲面对象的句柄,然后使用它们将曲面颜色设置为红色 (FaceColor
)、将曲面边的颜色设置为浅灰色 (EdgeColor
),并稍微提高应用光照后反射的环境光的亮度 (AmbientStrength
)。[sx sy sz] = meshgrid(110,20:5:30,1:5); verts = stream3(x,y,z,u,v,w,sx,sy,sz,.5); h = streamribbon(verts,x,y,z,cav,wind_speed,2); set(h,'FaceColor','r',... 'EdgeColor',[.7 .7 .7],... 'AmbientStrength',.6)
2.5定义视图并添加光照
-
volumebounds 命令为设置 axis 和颜色范围提供了便捷的途径。
-
camlight 在视点右侧创建光源,lighting 将光照方法设置为 Gouraud。
axis(volumebounds(x,y,z,wind_speed)) grid on view(3) camlight right;
3.利用流管显示散度
3.1流管可以显示哪些信息
流管类似于流线,只不过流管具有宽度,为表示信息提供了另外一个维度。
默认情况下,MATLAB® 图形通过流管的宽度显示向量场的散度。您还可以为每个流管顶点定义宽度,从而将其他数据映射到宽度。
本示例使用以下方法:
-
利用流管指示
wind
数据集中向量场的流向和散度 -
利用着色的切片平面指示叠加的风流的速度,并利用等高线提高可见性
输入项包括三维体坐标、向量场分量以及流管的起点位置。
3.2加载数据并计算所需的值
加载数据并计算绘图所需的值。这些值包括:
-
切片平面的位置(最大
x
值、最小y
值和海拔值) -
流管起点的最小
x
值 -
风速(向量场的模)
load wind xmin = min(x(:)); xmax = max(x(:)); ymin = min(y(:)); alt = 7.356; % z value for slice and streamtube plane wind_speed = sqrt(u.^2 + v.^2 + w.^2);
3.3绘制切片平面
绘制切片平面 (slice) 并设置 surface
属性以创建平滑着色的切片。使用 hsv
colormap 中的 16 种颜色。
hslice = slice(x,y,z,wind_speed,xmax,ymin,alt);
set(hslice,'FaceColor','interp','EdgeColor','none')
colormap hsv(16)
3.4在切片平面上添加等高线
在切片平面上添加等高线 (contourslice)。调整等高线间隔,使线条与切片平面上的颜色边界匹配:
-
调用 clim 以获取当前颜色范围。
在 R2022a 之前: 使用
caxis
,它具有与clim
相同的语法和参量。 -
将
contourslice
使用的插值方法设置为linear
,以便与slice
使用的默认值匹配。color_lim = clim; cont_intervals = linspace(color_lim(1),color_lim(2),17); hcont = contourslice(x,y,z,wind_speed,xmax,ymin,... alt,cont_intervals,'linear'); set(hcont,'EdgeColor',[.4 .4 .4],'LineWidth',1)
3.5创建流管
使用 meshgrid 创建流管起点数组,起点从最小 x
值开始,在 y
方向上的范围为 20 到 50,并位于 z
方向上的单个平面中(对应于其中一个切片平面)。
流管 (streamtube) 绘制在指定的位置,并放大为默认宽度的 1.25 倍,以突出散度(宽度)的变化。向量 [1.25 30] 中的第二个元素指定流管周长上的点数(默认值为 20)。随着流管大小的增加,您可能需要增加此值的大小,以保持光滑的流管外观。
在调用 streamtube
之前设置数据纵横比 (daspect)。
流管是曲面对象,因此您可以通过设置曲面属性来控制其外观。本示例通过设置曲面属性获得明亮的红色曲面。
[sx,sy,sz] = meshgrid(xmin,20:3:50,alt);
daspect([1,1,1]) % set DAR before calling streamtube
htubes = streamtube(x,y,z,u,v,w,sx,sy,sz,[1.25 30]);
set(htubes,'EdgeColor','none','FaceColor','r',...
'AmbientStrength',.5)
3.6定义视图
定义视图并添加光照(view、axis volumebounds、Projection
、camlight)。
view(-100,30)
axis(volumebounds(x,y,z,wind_speed))
set(gca,'Projection','perspective')
camlight left