【问题标题】:Visualize a three-dimensional array like cubic lattice using MATLAB使用 MATLAB 可视化三维数组,如三次点阵
【发布时间】:2015-03-24 10:20:21
【问题描述】:

我想使用 MATLAB 可视化一个三维数组,就像立方格子一样。

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

如果数组中的元素只有0和1,我知道怎么用3维数组画一个简单的立方格子,小立方体的大小是一样的。

但是,现在我有一个像这样的三维数组,

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

数组cube除了0和1都有值。我想把数组想象成立方格子,其中cube(:,:,1)表示立方格子的第一层,

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

值 0 表示什么都没有,而值 1 表示一个小的蓝色立方体。

大于1的值表示球体,球体的直径根据值变化。 想要的结果是这样的:

三维数组的可视化,1表示小绿 立方体,0表示无,值大于1表示白色球体, 球体的直径因数值而异。

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

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

想要的效果图

没关系,当立方体的边长为1时

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

【问题讨论】:

  • 目前还不清楚。你想要的是在 Matlab 中模拟这些图像?前者还是后者,你更喜欢哪一个?
  • 前者,我想把三维数组可视化,数组中的每个元素代表一个body,大小根据它的值来表示
  • 图片中的红色方块是什么?那些应该在那里吗?
  • 感谢您的关注,您可以输入红色方块。
  • 好的,我正在研究你写的代码。

标签: arrays matlab visualization


【解决方案1】:

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

结果:

代码应该是不言自明的。

% 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 可以渲染这样的东西......它几乎看起来像 OpenGL!
  • @rayryeng 老实说,它看起来不错,因为我在 2014b 中渲染了它。在以前的版本中很酷,但不是那个很酷。
猜你喜欢
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2014-06-12
  • 2014-03-24
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多