Main Content

isosurface

从三维体数据中提取等值面数据

说明

等值面是三维数据分布中具有相等值的各点的三维曲面表示。isosurface 函数通过连接空间的一个三维体内的常量值点来计算和绘制曲面。

绘制等值面

示例

isosurface(X,Y,Z,V,isovalue) 确定三维体数据 V 等于指定的 isovalue 的位置,并将 isosurface 绘制到当前坐标区中。

计算等值面数据并返回结构体

示例

s = isosurface(X,Y,Z,V,isovalue) 确定三维体数据 V 等于指定的 isovalue 的位置,并在结构体中返回所得曲面的面和顶点数据。

s = isosurface(X,Y,Z,V) 使用数据的直方图选择等值面值。

s = isosurface(V,isovalue) 使用基于 V 的大小的 XYZ 坐标。每个维度中的坐标从 1 开始,形成一个 m×n×p 网格,其中 [m,n,p] = size(V)

s = isosurface(V) 使用数据的直方图选择等值面值。

s = isosurface(___,colors) 对数组 colors 插值并转化为标量字段,并将数据存储在结构体的 facevertexcdata 字段中。

s = isosurface(___,'verbose') 在计算过程中将进度消息输出至命令行窗口。

s = isosurface(___,'noshare') 不创建共享顶点。此语法运行速度更快,但生成的顶点列表可能会长得多。处理或绘制顶点的后续操作可能会更慢。

计算等值面数据并返回数组

[faces,verts] = isosurface(___) 在单独的数组中返回面和顶点。

示例

[faces,verts,colors] = isosurface(___) 在单独的数组中返回面、顶点和颜色数据。

示例

全部折叠

使用 meshgrid 创建三维网格坐标,并创建三维体数据 V。然后,通过连接值为 0.0001 的点在三维体内创建一个等值面。绘制该等值面。

[x,y,z] = meshgrid([-3:0.25:3]); 
V = x.*exp(-x.^2 -y.^2 -z.^2);
isosurface(x,y,z,V,1e-4);

Figure contains an axes object. The axes object contains an object of type patch.

创建一个等值面,其中等值面的值为 0.0001。在结构体中返回所得曲面的面和顶点的位置。

[x,y,z] = meshgrid([-3:0.25:3]); 
V = x.*exp(-x.^2 -y.^2 -z.^2);
s = isosurface(x,y,z,V,1e-4)
s = struct with fields:
    vertices: [1693x3 double]
       faces: [3348x3 double]

创建一个等值面,其中等值面的值为 0.0001。在单独的数组中返回所得曲面的面和顶点的位置。

[x,y,z] = meshgrid([-3:0.25:3]); 
V = x.*exp(-x.^2 -y.^2 -z.^2);
[faces,verts] = isosurface(x,y,z,V,1e-4)
faces = 3348×3

     1     2     3
     1     4     2
     2     4     5
     4     6     5
     5     6     7
     6     8     7
     9    10    11
     9    12    10
    10    12    13
    12    14    13
      ⋮

verts = 1693×3

    0.2500   -0.2500   -2.7918
    0.2181   -0.2500   -2.7500
    0.2500   -0.4366   -2.7500
    0.2500         0   -2.8092
    0.2049         0   -2.7500
    0.2500    0.2500   -2.7918
    0.2181    0.2500   -2.7500
    0.2500    0.4366   -2.7500
    0.5000   -0.7500   -2.7935
    0.4165   -0.7500   -2.7500
      ⋮

创建一个等值面,其中等值面的值为 0.0001。计算面和顶点的位置并在结构体中返回结果。然后,通过将结构体数据传递给 patch 函数来绘制面和顶点数据。调整绘图的视图,更改曲面颜色,并指定自定义光照。

[x,y,z] = meshgrid([-3:0.25:3]); 
V = x.*exp(-x.^2 -y.^2 -z.^2);
s = isosurface(x,y,z,V,1e-4);
p = patch(s);
isonormals(x,y,z,V,p)
view(3);
set(p,'FaceColor',[0.5 1 0.5]);  
set(p,'EdgeColor','none');
camlight;
lighting gouraud;

Figure contains an axes object. The axes object contains an object of type patch.

将流数据可视化,但用颜色对曲面进行标记以指示沿 X 轴的幅值。首先,通过指定包含等值面中每个顶点的标量值的向量来计算颜色数据。这些颜色映射到当前颜色图。

[x,y,z] = meshgrid([-3:0.25:3]); 
V = x.*exp(-x.^2 -y.^2 -z.^2);
[faces,verts,colors] = isosurface(x,y,z,V,1e-4,x);

然后,通过将数据传递给 patch 函数,用计算的颜色数据绘制等值面。设置相机角度和纵横比,并更改颜色图。

patch('Vertices',verts,'Faces',faces,'FaceVertexCData',colors,...
    'FaceColor','interp','EdgeColor','interp')
view(3) 
colormap copper

Figure contains an axes object. The axes object contains an object of type patch.

输入参数

全部折叠

x 轴坐标数据,指定为向量或与 V 大小相同的三维数组。如果指定三维数组,它必须单调正交分布,就好像是由 meshgrid 函数生成的一样。

数据类型: single | double

y 轴坐标数据,指定为向量或与 V 大小相同的三维数组。如果指定三维数组,它必须单调正交分布,就好像是由 meshgrid 函数生成的一样。

数据类型: single | double

z 轴坐标数据,指定为向量或与 V 大小相同的三维数组。如果指定三维数组,它必须单调正交分布,就好像是由 meshgrid 函数生成的一样。

数据类型: single | double

三维体数据,指定为与 XYZ 大小相同的三维数组。

数据类型: single | double

用于计算曲面的等值面值,指定为标量。

数据类型: single | double

颜色数据,指定为向量或与 V 大小相同的三维数组。使用此参量控制 isosurface 的颜色映射,其数据不同于用于计算 isosurface 的数据。此参量通过对所得的 isosurface 着色来叠加另一个数据集。向量或数组包含 isosurface 中每个顶点的标量值,并使用当前颜色图进行映射。

您可以使用 colormap 函数自定义颜色方案。这种自定义需要更改控制曲面和颜色图之间关系的数组中的值。索引数组将绘图的特定位置与颜色图中的颜色相关联。默认情况下,C 中的中间值线性映射到颜色图中间的行。

数据类型: single | double

输出参量

全部折叠

等值面数据,以结构体形式返回,其中的字段 facesvertices 包含对应的面和顶点数据。

数据类型: single | double

计算的等值面的面数据,以数组形式返回。

数据类型: single | double

计算的等值面的顶点数据,以数组形式返回。

数据类型: single | double

计算的等值面的颜色数据,以数组形式返回,其中包含每个顶点的插补颜色数据标量值. 系统将根据当前颜色图来绘制该数据。colors 数组的大小必须与 V 相同。

数据类型: single | double

提示

  • 如果要指定曲面的自定义相机视图、光照或不同颜色图,请使用 patch 函数绘制从 isosurface 返回的数据。您可以将 isosurface 创建的结构体直接传递给 patch 命令。例如:

    s = isosurface(X,Y,Z,V,isovalue);
    patch(s)
  • 也可以通过指定属性名称将单个面和顶点数组传递给 patch。例如:

    [faces,verts] = isosurface(X,Y,Z,V,isovalue) ;
    patch('Faces',faces,'Vertices',verts);

扩展功能

版本历史记录

在 R2006a 之前推出