MATLAB — функция изоповерхности, неправильные координаты (входная сетка не является допустимой MESHGRID)

У меня есть файл данных из физической модели, который показывает плотность определенного материала вокруг объекта. Файл данных находится в сферических координатах и ​​изменен до исходных размеров (Theta, Phi, R и плотность). Sph2cart используется для преобразования сферических координат в декартовы координаты (x,y,z). Чтобы визуализировать различные плотности вокруг объекта, я нашел функцию изоповерхности в MATLAB (пример: 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.

Ошибка в изонормалях (строка 75) n(:,1)=interp3(x, y, z, nx, verts(:,1), verts(:,2), verts(:,3));

Ошибка в data_import_plot (строка 16) isonormals(x,y,z,density,p);

Если я создам свою собственную сетку с очень простыми координатами x, y, z (проверьте% в коде), это сработает. Я не знаю, что я делаю неправильно. Я надеюсь, что кто-то может помочь мне.

Привет, Джероен

P.S. если вы хотите, вы можете скачать файл данных по этой ссылке https://www.dropbox.com/s/msphgmg2oyi91cx/denNa20.dat?dl=0


person Terranees    schedule 20.03.2015    source источник


Ответы (1)


Я обнаружил, что проблема заключалась в том, что изоповерхность не принимает неправильные координаты x, y и z. Это то, что я нашел, чтобы быть решением. Я использовал разбросанныйИнтерполант для интерполяции плотности, а затем создал свою собственную сетку.

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
person Terranees    schedule 24.03.2015