2015-02-04 2 views
2

У меня есть два 3D-массива, один содержит 3D-данные электрического поля, а другой - трехмерную маску объекта, который меня интересует, взяв произведение этих двух массивов me массив с электрическим полем только маски. Я успешно создал изоповерхность маски, но когда я пытаюсь сделать изоповерхность произведения маски и массива электрического поля, я получаю тот же график, что и при построении только маски (это всего лишь массив нулей и 1). Есть ли способ представить данные на изоповерхности?Данные о графике на изоповерхности в MatLab

На данный момент я просто кладу массивы в функции изоповерхности: isosurface(mask), что дает мне:

mask isosurface

затем я пытаюсь построить продукт моей маски и массива данных:

isosurface(mask.*EArr) и я получаю следующее:

mask with data

Но если смотреть только один ломтик, используя код imagesc(mask(:,:,35).*EArr(:,:,35)) я получаю:

slice mask with data

Что я ищу, чтобы сделать это, чтобы получить просмотра ломтиков последнего изображения в качестве 3D объекта похожи к тому, как я могу просматривать свою маску в виде 3D-объекта на первом снимке.

+0

Пожалуйста, добавьте минимальный пример, чтобы люди могли видеть, что вы делаете. –

+0

Спасибо, я обновил свой вопрос –

+1

Я считаю, что 'isosurface' требует как минимум двух аргументов - данных и isovalue. Но вы называете это только одним аргументом, и в любом случае он дает сплошную поверхность, поэтому вы не можете «заглянуть внутрь». Возможно, попробуйте 'contour3'. –

ответ

3

Если я хорошо понимаю, вы хотите построить свое поле на поверхности своей маски. Чтобы сделать это, получите патч, возвращенный isosurface, затем проинтегрируйте свое поле в вершинах этого патча. Завершите, запишите его, используя полученные интерполированные данные как «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); 

Это дает такие вещи: enter image description here

+0

Очень крутой ответ! –

+0

Прохладный ответ! Вы знаете, как использовать «isonormals» с вашим примером? Это может сделать сюжет еще более прекрасным. – knedlsepp

0

Попробуйте использовать isosurface(mask,th) где th - это значение, в котором будет создана изоповерхность. Поскольку я не знаю величины ваших данных, я не могу предложить вам ценность. Попробуйте разные значения, например. 0.01

Смежные вопросы