首先,更正一个一直以来自己对isosurface的错误的理解:
在matlab官方help文档里面,对isosurface的定义如下:
Extract isosurface data from volume data
也就是说,isosurface的功能,是在一个三维矩阵数据中,提取出其中数据值等于X的那些个数据。
也就是说,提取出一个等值面来。
它的功能并不是把一个三维数据可视化,但它是实现上述目的的一个重要过程。
嗯,我一定是没有说清楚的。所以你看不懂也没有关系,我的目的并不是要让你看懂。
下面,是一些以让你看懂为目的东西。
isosurface的语法
fv = isosurface(X,Y,Z,V,isovalue)
fv = isosurface(V,isovalue)
fvc = isosurface(...,colors)
下面分别详解如下:
- 就像之前讲streamslice的文章一样,isosurface中包含的
X,Y,Z
,是要经过对三维矩阵V的meshgrid
操作后产生的。而isovalue
则是所要从V中提取的数据值。
注意,等号左边的句柄fv
代表了matlab中的一个结构体(struct),有关结构体的部分我的理解也不太系统。简单地说,就是跟C++中的结构体类似。
比如结构体person里面,包含有name,height,weight等等变量,然后这些变量当然分别有它们对应的值。
所以你输入name
的时候,matlab会告诉你,没有这个东西,错误。正确的做法是输入person.name
,这样matlab就认识了,就会输出这个人对应的名字的值。同理person.height
和person.weight
。
回到这里的fv
以及下面的fvc
来,后面再具体介绍。 - 其实,不要
X,Y,Z
也可以,如果你只是想大概看一下你手头上这个三维的数组的某个等值面到底长什么样子的话,那大可不必meshgrid
;但如果你在不同维度里面所划分的网格精度不同,又想准确的知道某个物理量(V)的某个等值面在你模拟盒子的那些位置的话,meshgrid
这一部必不可少。 - colors是说,你可以控制这个等值面的颜色。
因为更多地时候,对于一个三维数组,我们希望看到它的三维图像的话,一个等值面其实并没有什么卵用。但是,一系列的等值面在一张图中一起画出来,就大概可以看清楚整个这个三维数组的空间结构了。
而这个时候,V这个值,就是一个一维数组,代表了一系列的量;
(这里可能不正确,isovalue是否可以是一个数组,还需亲测。在IDL中,isovalue是可以写成数组的;matlab里面,竟然会不行???)
而colors这里,就会给V中每一个值都分配一个颜色,这样你就能看清楚哪一个面是哪一个值了
注意:想看清楚还需要两步,第一是要生成对应的colorbar,比较简单;第二是要调整每一个面的透明度,不透明的话你就只能看见最外面那个等值面,里面是什么样你还是看不到,这个比较麻烦。
所以,看到这里我们发现,其实可视化一个三维数据,isosurface并不是一种最好的方式,甚至连一种很好的方式都算不上。
但别的你又不会,还能咋办呢?硬着头皮画呗。
fvc
上面的语法中,写到了很多fv
,fvc
这样的结构体。
其中,f
,指的是faces;v
,指的是vertices;c
,指的是colors。
除了直接把fvc
写在等号左边,生成一个结构体(其中包含它们三个)之外,还可以把[f,v,c]
写在等号的左边,来分别生成三个矩阵。
后者更加方便。
这些量分别代表了什么含义呢?
�很抱歉,因为我不知道自己对它们含义的意会是否正确全面,所以没法斩钉截铁简单透彻的言传上述问题。
我所知道的是,isosurface
的功能,就是从你的三维数组中提取出上述三个量,然后通过patch
这个功能,分别对这三个量的性质进行定义,上色。
比如:
% 生成网格信息
[xx,yy,zz]=meshgrid(cal_gy,cal_gx,cal_gz);
% 将三维数组var的一系列值val,提取到f,v,c中,其中最右边的xx代表了colors的数组大小
[faces,verts,colors] = isosurface(xx,yy,zz,var,val,xx);
% 在patch中,把提取出来的f/v/c赋值给patch里的三个性质
patch('Vertices', verts, 'Faces', faces, ...
'FaceVertexCData', colors, ...
'FaceColor','interp', ...
'edgecolor', 'interp');
% 最后加上看的角度(view),坐标轴(axis)以及colorbar(jet)即可画出三维图。
view(30,-15);
axis vis3d;
colormap jet
具体的图例如下:
然而这样的图在画的时候,也有问题——即超级超级耗时间!
从这里也可以想象,如果isovalue是一个数组的话,那就相当于画了好多幅图,两个图已经如此之卡了,更何况多个呢?