我有一个来自物理模型的数据文件,它显示了对象周围某种材料的密度。数据文件采用球面坐标,并重新整形为其原始尺寸(Theta,Phi,R和密度)。 Sph2cart用于从球坐标转换为笛卡尔坐标(x,y,z)。为了可视化对象周围的不同密度,我在MATLAB中找到了isosurface函数(例如:http://www.mathworks.com/matlabcentral/answers/110977-3d-density-plot-multiple-isosurfaces-on-the-same-plot)。
这是我目前的代码:
input = importdata( 'denNa20.dat' );
input(1,:)=[];
theta = reshape(input(:,3),200,20,40);
phi = reshape(pi/2 - input(:,2),200,20,40);
r = reshape(input(:,1),200,20,40);
density = reshape(input(:,4),200,20,40);
[x,y,z] = sph2cart(theta,phi,r);
% This has ofcourse the complete wrong dimensions but then it works
% [x,y,z] = meshgrid(1:1:20,1:1:200,1:1:40);
p = patch(isosurface(y,x,z,density,0.00001));
isonormals(x,y,z,density,p);
set(p,'FaceColor','red','EdgeColor','none','FaceAlpha',0.15);
daspect([1 1 1])
view(3)
grid on
camlight; lighting phong
当我运行代码时,我收到以下错误:
使用interp3时出错(第146行) 输入网格不是有效的MESHGRID。
isonormals出错(第75行) n(:,1)= interp3(x,y,z,nx,verts(:,1),verts(:,2),verts(:,3));
data_import_plot中的错误(第16行) isonormals(X,Y,Z,密度,P);
如果我用非常简单的x,y,z坐标(在代码中检查%)创建我自己的网格网格,它就可以工作。我不知道我做错了什么。我希望有人可以帮助我。
干杯, 的Jeroen
P.S。如果您愿意,可以从此链接https://www.dropbox.com/s/msphgmg2oyi91cx/denNa20.dat?dl=0
下载数据文件答案 0 :(得分:2)
我发现问题是isosurface不接受不规则的x,y和z坐标。这就是我发现的解决方案。我使用scatInterpolant来插入密度,然后创建我自己的meshgrid。
input = importdata( 'denNa20.dat' );
input(1,:)=[];
[x,y,z] = sph2cart(input(:,3),pi/2 - input(:,2),input(:,1));
density = input(:,4);
F = scatteredInterpolant(x,y,z,density);
xRange = linspace(min(x),max(x),75);
yRange = linspace(min(y),max(y),75);
zRange = linspace(min(z),max(z),75);
[x,y,z] = meshgrid(xRange,yRange,zRange);
density = F(x,y,z);
axis([-5000,5000,-5000,5000,-5000,5000])
p = patch(isosurface(x,y,z,density,0.00001));
isonormals(x,y,z,density,p);
set(p,'FaceColor','red','EdgeColor','none','FaceAlpha',0.50);
daspect([1 1 1])
view(3)
grid on
camlight; lighting phong