使用MATLAB可视化立体晶格等三维数组

时间:2015-03-24 10:20:21

标签: arrays matlab visualization

我希望使用MATLAB可视化三维数组,就像立方点阵一样。

我已阅读How to plot 3D grid (cube) in MatlabSimple cubic lattice using three-dimensional array

如果数组中的元素只有0和1,我知道如何使用三维数组绘制一个简单的立方晶格,小立方体具有相同的大小。

然而,现在我有一个像这样的三维数组,

cube(:,:,1) =
 1     0     1
 0     1     1
 2    1     0
cube(:,:,2) =

 0     0     1
 1     5     1
 0     1     0

cube(:,:,3) =

 1     1     1
 0     1     1
 2    0     1

数组立方体的值除了0和1.我想将数组可视化为立方晶格,其中立方体(:,:,1)表示立方晶格的第一层,

 cube(:,:,2) denotes the second floor, and 
 cube(:,:,3) the third floor.

值0表示无,而值1表示小蓝色立方体。

大于1的值表示球体,球体的直径根据值而变化。      期望的结果是这样的:Visualization of a three-dimensional array, 1 denotes a small green cube,0 denotes nothing,Value greater than 1 denotes white sphere, the diameter of sphere varies according to the value.

  

三维阵列的可视化,1表示小绿色   立方体,0表示无,大于1的值表示白色球体   球体直径根据值而变化。

为了更清楚地解释我的问题,展示一个二维数组的可视化

enter image description here

  

1表示小黑球,0表示无,值大于1   表示白色球体,球体的直径根据不同而不同   值。

The desired  effect drawing所需的效果图

enter image description here   好的,当立方体的边长是1

enter image description here   当设置边长为2时,drawCube([ix,iy,iz],2,Royal_Blue)。出现问题,立方体重叠,

1 个答案:

答案 0 :(得分:10)

让我告诉你我的尝试。它基于独立绘制每个立方体和圆。如果A很大,这将很慢。

结果:

enter image description here

代码应该是自我解释的。

% Create some data. This piece of code just creates some matrix A with
% some 1s and 0s and inserts a 2 and a 3 to specific positions. Subsitute
% this with your own data matrix.
th=0.2;
A=double(rand(10,10,10)<th);
A(1,1,1)=2;
A(5,5,5)=3;

% A nice color. I just dont like the standard blue so I picked another one.
Royal_Blue=[65 105 225]/255; 

%%%%%%%%%%%%%%%%%%%%%%
%% Draw cubes

% Obtain all the linear indexes (search mathworks for help between  
% subscripts vs linear indices) of the locations where a cube is wanted 
% (A==1)

ind=find(A==1);

% Create a figure
fig=figure();
hold on

% Draw the cubes one by one

for ii=1:length(ind)

    % For each linear index get its subscript (that also 
    % will be x,y,z position)
    [ix,iy,iz]=ind2sub(size(A),ind(ii));

    % Use the drawcube function to draw a single cube in the
    % desired position with the desired size (1) and colour.
    drawCube([ix,iy,iz],1,Royal_Blue);
end

% Nice plotting code. This just makes the drawing nicer. 

camlight left
lighting gouraud
axis equal
axis off
view(-50,25)

%%%%%%%%%%%%%%%
%% Now draw the spheres

% This code is the same as the previous one but I just draw
% spheres instead of cubes.
ind=find(A>1);
% create an sphere
[X,Y,Z] = sphere;
for ii=1:length(ind)
    [ix,iy,iz]=ind2sub(size(A),ind(ii));
    % scale sphere
    Xs=X*A(ix,iy,iz)/2;
    Ys=Y*A(ix,iy,iz)/2;
    Zs=Z*A(ix,iy,iz)/2;
    surf(Xs+ix,Ys+iy,Zs+iz,'edgecolor','none','facecolor',[1 1 1]);

end

% Change the background colour to black
whitebg(fig,'k')
% MAke sure it stays black
set(gcf, 'InvertHardCopy', 'off');

函数drawCube如下:

function drawCube( origin, size,color)
% From
% http://www.mathworks.com/matlabcentral/newsreader/view_thread/235581

if nargin<3
    color='b';

end
x=([0 1 1 0 0 0;1 1 0 0 1 1;1 1 0 0 1 1;0 1 1 0 0 0]-0.5)*size+origin(1);
y=([0 0 1 1 0 0;0 1 1 0 0 0;0 1 1 0 1 1;0 0 1 1 1 1]-0.5)*size+origin(2);
z=([0 0 0 0 0 1;0 0 0 0 0 1;1 1 1 1 0 1;1 1 1 1 0 1]-0.5)*size+origin(3);
for i=1:6
    h=patch(x(:,i),y(:,i),z(:,i),color);

    set(h,'edgecolor','none')

end

end