首先召边,更正一個一直以來自己對isosurface的錯誤的理解:
在matlab官方help文檔里面辜伟,對isosurface的定義如下:
Extract isosurface data from volume data
也就是說佳窑,isosurface的功能手负,是在一個三維矩陣數(shù)據(jù)中疾渣,提取出其中數(shù)據(jù)值等于X的那些個數(shù)據(jù)拗馒。
也就是說汛骂,提取出一個等值面來罕模。
它的功能并不是把一個三維數(shù)據(jù)可視化,但它是實(shí)現(xiàn)上述目的的一個重要過程帘瞭。
嗯淑掌,我一定是沒有說清楚的。所以你看不懂也沒有關(guān)系蝶念,我的目的并不是要讓你看懂抛腕。
下面,是一些以讓你看懂為目的東西媒殉。
isosurface的語法
fv = isosurface(X,Y,Z,V,isovalue)
fv = isosurface(V,isovalue)
fvc = isosurface(...,colors)
下面分別詳解如下:
- 就像之前講streamslice的文章一樣担敌,isosurface中包含的
X,Y,Z
,是要經(jīng)過對三維矩陣V的meshgrid
操作后產(chǎn)生的廷蓉。而isovalue
則是所要從V中提取的數(shù)據(jù)值全封。
注意,等號左邊的句柄fv
代表了matlab中的一個結(jié)構(gòu)體(struct)桃犬,有關(guān)結(jié)構(gòu)體的部分我的理解也不太系統(tǒng)刹悴。簡單地說,就是跟C++中的結(jié)構(gòu)體類似攒暇。
比如結(jié)構(gòu)體person里面土匀,包含有name,height,weight等等變量,然后這些變量當(dāng)然分別有它們對應(yīng)的值形用。
所以你輸入name
的時候就轧,matlab會告訴你,沒有這個東西尾序,錯誤钓丰。正確的做法是輸入person.name
,這樣matlab就認(rèn)識了每币,就會輸出這個人對應(yīng)的名字的值。同理person.height
和person.weight
琢歇。
回到這里的fv
以及下面的fvc
來兰怠,后面再具體介紹梦鉴。 - 其實(shí),不要
X,Y,Z
也可以揭保,如果你只是想大概看一下你手頭上這個三維的數(shù)組的某個等值面到底長什么樣子的話肥橙,那大可不必meshgrid
;但如果你在不同維度里面所劃分的網(wǎng)格精度不同秸侣,又想準(zhǔn)確的知道某個物理量(V)的某個等值面在你模擬盒子的那些位置的話存筏,meshgrid
這一部必不可少。 - colors是說味榛,你可以控制這個等值面的顏色椭坚。
因?yàn)楦嗟貢r候,對于一個三維數(shù)組搏色,我們希望看到它的三維圖像的話善茎,一個等值面其實(shí)并沒有什么卵用。但是频轿,一系列的等值面在一張圖中一起畫出來垂涯,就大概可以看清楚整個這個三維數(shù)組的空間結(jié)構(gòu)了。
而這個時候航邢,V這個值耕赘,就是一個一維數(shù)組,代表了一系列的量膳殷;
(這里可能不正確鞠苟,isovalue是否可以是一個數(shù)組,還需親測秽之。在IDL中当娱,isovalue是可以寫成數(shù)組的;matlab里面考榨,竟然會不行跨细??河质?)
而colors這里冀惭,就會給V中每一個值都分配一個顏色,這樣你就能看清楚哪一個面是哪一個值了
注意:想看清楚還需要兩步掀鹅,第一是要生成對應(yīng)的colorbar散休,比較簡單;第二是要調(diào)整每一個面的透明度乐尊,不透明的話你就只能看見最外面那個等值面戚丸,里面是什么樣你還是看不到,這個比較麻煩扔嵌。
所以限府,看到這里我們發(fā)現(xiàn)夺颤,其實(shí)可視化一個三維數(shù)據(jù),isosurface并不是一種最好的方式胁勺,甚至連一種很好的方式都算不上世澜。
但別的你又不會,還能咋辦呢署穗?硬著頭皮畫唄寥裂。
fvc
上面的語法中,寫到了很多fv
案疲,fvc
這樣的結(jié)構(gòu)體封恰。
其中,f
络拌,指的是faces俭驮;v
,指的是vertices春贸;c
混萝,指的是colors。
除了直接把fvc
寫在等號左邊萍恕,生成一個結(jié)構(gòu)體(其中包含它們?nèi)齻€)之外逸嘀,還可以把[f,v,c]
寫在等號的左邊,來分別生成三個矩陣允粤。
后者更加方便崭倘。
這些量分別代表了什么含義呢?
?很抱歉类垫,因?yàn)槲也恢雷约簩λ鼈兒x的意會是否正確全面司光,所以沒法斬釘截鐵簡單透徹的言傳上述問題。
我所知道的是悉患,isosurface
的功能残家,就是從你的三維數(shù)組中提取出上述三個量,然后通過patch
這個功能售躁,分別對這三個量的性質(zhì)進(jìn)行定義坞淮,上色。
比如:
% 生成網(wǎng)格信息
[xx,yy,zz]=meshgrid(cal_gy,cal_gx,cal_gz);
% 將三維數(shù)組var的一系列值val陪捷,提取到f回窘,v,c中市袖,其中最右邊的xx代表了colors的數(shù)組大小
[faces,verts,colors] = isosurface(xx,yy,zz,var,val,xx);
% 在patch中啡直,把提取出來的f/v/c賦值給patch里的三個性質(zhì)
patch('Vertices', verts, 'Faces', faces, ...
'FaceVertexCData', colors, ...
'FaceColor','interp', ...
'edgecolor', 'interp');
% 最后加上看的角度(view),坐標(biāo)軸(axis)以及colorbar(jet)即可畫出三維圖。
view(30,-15);
axis vis3d;
colormap jet
具體的圖例如下:
然而這樣的圖在畫的時候付枫,也有問題——即超級超級耗時間烹玉!
從這里也可以想象驰怎,如果isovalue是一個數(shù)組的話阐滩,那就相當(dāng)于畫了好多幅圖,兩個圖已經(jīng)如此之卡了县忌,更何況多個呢掂榔?