標籤:

MATLAB分享 - 包含投影的三維等值面圖

無奈於老闆天天催著說論文里要有一張好看的圖,於是今天順便用MATLAB擼了一個包含投影面的三維圖,大概長這樣

包括一個isosurface等值面,以及三個坐標平面的投影圖。

上圖裡面的isosurface就是官方文檔里的圖,直接用在這裡作為例子了。

[x,y,z,v] = flow;np = patch(isosurface(x,y,z,v,-3));nisonormals(x,y,z,v,p)np.FaceColor = red;np.EdgeColor = none;ndaspect([1,1,1])nview(3); axis tightn% 下面裝燈,我感覺放兩個燈(拷貝兩遍)比較合適,一個太暗了。n% 最多可以放8個燈,headlight表示頭燈,還有left和right。ncamlight(headlight) nlighting gouraudncamlight(right)nlighting gouraudn

難點是三個坐標平面的投影圖,從網上找了一圈都沒看到合適的,看來只能自己想辦法了。

如果你僅僅要做xy平面的投影圖,那麼這個問題會簡單些。投影面可以用surf函數,把高度設為你想要位置的一個平面(例如z=-5),顏色設為你想要的顏色即可。

flow_xy=v(:,:,12);nx_xy=x(:,:,12);ny_xy=y(:,:,12);nxy=-5*ones(size(flow_xy));nsurf(x_xy,y_xy,xy,flow_xy,edgecolor,none)n

畫出來是這樣

但是如果要畫yz和zx平面的投影,這個想法就不奏效了。

接下來我找到了slice這個函數,它可以畫出你指定的截面。所以這個問題就可以用這個函數解決了,思路是這樣:在x軸最大值處,y軸最大值處,和z軸最小值處的slice平面就是我們想要的投影面。

然而呢,你試一試就會知道,上面的思路離答案還有一段距離。因為slice函數畫的是你設的截面處的值,而我們想在投影面畫的是圖形中某處的切面值。所以按照上面思路畫的圖中的三個面實際上是邊界處的值。

解決方案嘛,其實很簡單。你把你想要的切面值拷貝到邊界處就好了嘛。

代碼比如可以這樣寫

vx=zeros(size(v));nvx(:,size(v,2),:)=v(:,25,:);nhx = slice(x,y,z,vx,xmax,[],[]);nhx.FaceColor = interp;nhx.EdgeColor = none;n

最後,調節一下光照和材質即可。

推薦閱讀:

有正整數1~10,出現的概率分布給定,如何利用MATLAB按照各數字出現的概率輸出一個數字?
MATLAB神經網路(一):BP神經網路
matlab小工具-Matlab Coder
MATLAB編輯器如何自動給代碼操作符前後加空格?
matlab的floor函數是否有bug?

TAG:MATLAB |