可视象立方晶格利用MATLAB一个三维阵列 [英] Visualize a three-dimensional array like cubic lattice using MATLAB

查看:1848
本文介绍了可视象立方晶格利用MATLAB一个三维阵列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要显示一个三维阵列一样的立方晶格利用MATLAB

I want to visualize a three-dimensional array just like cubic lattice using MATLAB.

我已阅读如何绘制在Matlab三维网格(立方体) 和<一个href=\"http://stackoverflow.com/questions/26644918/simple-cubic-lattice-using-three-dimensional-array\">Simple立方晶格使用三维阵列

如果阵列中的元件仅为0和1,我知道如何使用一个三维阵列,以绘制一个简单的立方点阵,该小立方体具有相同的大小。

If element in the array is only 0 and 1, I know how to use a three-dimensional array to draw a simple cubic lattice, the small cube has the same size.

不过,现在我有一个这样的三维阵列,

However, Now I have a three-dimensional array like this,

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)表示立方晶格的第一层,

The array cube have value except 0 and 1. I want to visualize the array like cubic lattice, in which cube(:,:,1) denotes the first floor of the cubic lattice,

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

值为0表示没有,而值1表示一个蓝色的小方块。

The value 0 denotes nothing, while value 1 denotes a small blue cube.

值大于1表示球形,球的直径根据值而变化。
     期望的结果是这样的:

Value greater than 1 denotes sphere, the diameter of sphere varies according to the value. The desired result is something like this:

一个三维阵列的可视化中,1表示一个小绿
  立方体,0表示没有什么,值大于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.

要解释一下我的问题更清晰,显示二维数组的一个可视化

To explain my question more clear, show one visualization of two-dimensional array

1表示一个黑色的小球体,0表示没有什么,值大于1
  表示白色的球体,球体的直径根据不同
  值。

1 denotes a small black sphere,0 denotes nothing,Value greater than 1 denotes white sphere, the diameter of sphere varies according to the value.

选择期望的效果图

The desired effect drawing


  它是确定,当立方体的边长为1

it is Ok, when side length of cube is 1


  设置边长为时2,drawCube([IX,IY,IZ],2,Royal_Blue)。出现该问题,立方体是重叠的,

when set side length as 2, drawCube([ix,iy,iz],2,Royal_Blue). The problem occurs, cubes is overlapping,

推荐答案

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

Let me show you my attempt. It is based into drawing each cube and circle independently. This will be slow in if A is big.

结果:

在code应该是不言而喻的。

The code should be self explanatory.

% 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

这篇关于可视象立方晶格利用MATLAB一个三维阵列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆