在 MatLab 中将数据绘制到等值面上
Plot data on to an isosurface in MatLab
我有两个 3D 数组,一个包含电场的 3D 数据,另一个是我感兴趣的物体的 3D 掩模,取这两个数组的乘积得到一个包含电场的数组只是面具的领域。我已经成功创建了掩模的等值面,但是当我尝试制作掩模和电场阵列的乘积的等值面时,我得到的图形与我仅绘制掩模时的图形相同(这只是一个零和 1 的数组).有没有办法在等值面上表示数据?
目前我只是将数组放入等值面函数:
isosurface(mask)
,这给了我:
然后我尝试绘制掩码和数据数组的乘积:
isosurface(mask.*EArr)
我得到以下信息:
但是如果我使用代码只看一个切片
imagesc(mask(:,:,35).*EArr(:,:,35))
我得到:
我想要做的是将最后一张图片的切片作为 3D 对象查看,类似于我在第一张图片中将蒙版作为 3D 对象查看的方式。
尝试使用 isosurface(mask,th)
,其中 th
是创建等值面的值。由于我不知道您的数据量级,因此无法向您建议一个值。尝试不同的值,例如0.01
如果我理解得很好,你想在你的面具表面绘制你的场。
为此,获取等值面返回的面片,然后在该面片的顶点上插入您的场。最后,使用生成的插值数据将其绘制为 'FaceVertexCData'。
这是一个带有虚拟数据的示例:
% PREPARATION
% ===========
% GENERATE A GRID
[X Y Z] = meshgrid([0:1/100:1],[0:1/100:1],[0:1/100:1]);
% GENERATE RANDOM DATA
DATA = zeros(101,101,101);
DATA(:) = interp3([0:1/10:1],[0:1/10:1],[0:1/10:1],rand(11,11,11),X(:),Y(:),Z(:),'cubic');
% GENERATE A RANDOM MASK
MASK = zeros(101,101,101);
MASK(:) = sqrt(sum([X(:)-0.5 Y(:)-0.5 Z(:)-0.5].^2,2)) - 0.3 - interp3([0:1/10:1],[0:1/10:1],[0:1/10:1],0.1*rand(11,11,11),X(:),Y(:),Z(:),'cubic');
%
% ACTUAL PROBLEM
% ==============
% EXTRACT THE MASK SURFACE
SURF = isosurface(X,Y,Z,MASK,0);
% INTERPOLATE DATA ON MASK SURFACE
DATA_SURF = interp3(X,Y,Z,DATA,SURF.vertices(:,1),SURF.vertices(:,2),SURF.vertices(:,3));
% PLOT THE MASK SURFACE AND DATA
hold on; axis square; axis([0 1 0 1 0 1]); view(3); camlight
patch('Faces',SURF.faces,'Vertices',SURF.vertices,'EdgeColor','none','FaceColor','interp','FaceVertexCData',DATA_SURF);
这给出了这样的东西:
我有两个 3D 数组,一个包含电场的 3D 数据,另一个是我感兴趣的物体的 3D 掩模,取这两个数组的乘积得到一个包含电场的数组只是面具的领域。我已经成功创建了掩模的等值面,但是当我尝试制作掩模和电场阵列的乘积的等值面时,我得到的图形与我仅绘制掩模时的图形相同(这只是一个零和 1 的数组).有没有办法在等值面上表示数据?
目前我只是将数组放入等值面函数:
isosurface(mask)
,这给了我:
然后我尝试绘制掩码和数据数组的乘积:
isosurface(mask.*EArr)
我得到以下信息:
但是如果我使用代码只看一个切片
imagesc(mask(:,:,35).*EArr(:,:,35))
我得到:
我想要做的是将最后一张图片的切片作为 3D 对象查看,类似于我在第一张图片中将蒙版作为 3D 对象查看的方式。
尝试使用 isosurface(mask,th)
,其中 th
是创建等值面的值。由于我不知道您的数据量级,因此无法向您建议一个值。尝试不同的值,例如0.01
如果我理解得很好,你想在你的面具表面绘制你的场。 为此,获取等值面返回的面片,然后在该面片的顶点上插入您的场。最后,使用生成的插值数据将其绘制为 'FaceVertexCData'。 这是一个带有虚拟数据的示例:
% PREPARATION
% ===========
% GENERATE A GRID
[X Y Z] = meshgrid([0:1/100:1],[0:1/100:1],[0:1/100:1]);
% GENERATE RANDOM DATA
DATA = zeros(101,101,101);
DATA(:) = interp3([0:1/10:1],[0:1/10:1],[0:1/10:1],rand(11,11,11),X(:),Y(:),Z(:),'cubic');
% GENERATE A RANDOM MASK
MASK = zeros(101,101,101);
MASK(:) = sqrt(sum([X(:)-0.5 Y(:)-0.5 Z(:)-0.5].^2,2)) - 0.3 - interp3([0:1/10:1],[0:1/10:1],[0:1/10:1],0.1*rand(11,11,11),X(:),Y(:),Z(:),'cubic');
%
% ACTUAL PROBLEM
% ==============
% EXTRACT THE MASK SURFACE
SURF = isosurface(X,Y,Z,MASK,0);
% INTERPOLATE DATA ON MASK SURFACE
DATA_SURF = interp3(X,Y,Z,DATA,SURF.vertices(:,1),SURF.vertices(:,2),SURF.vertices(:,3));
% PLOT THE MASK SURFACE AND DATA
hold on; axis square; axis([0 1 0 1 0 1]); view(3); camlight
patch('Faces',SURF.faces,'Vertices',SURF.vertices,'EdgeColor','none','FaceColor','interp','FaceVertexCData',DATA_SURF);
这给出了这样的东西: