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創建流帶
-
使用?meshgrid?為流帶創建起點數組。有關指定起點數組的信息,請參閱指定流線圖的起點。
-
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?和顏色范圍提供了便捷的途徑。
-
添加?grid?并將?view?設置為三維(
streamribbon
?不會更改當前視圖)。 -
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