在MATLAB

时间:2015-08-08 17:03:13

标签: matlab image-processing matrix graphics 3d

我想构建一个具有x,y和z尺寸的空心立方体,并用许多小立方体填充其体积。以下图像与我想要的相似, enter image description here

但是,我想使用小立方体而不是小球体。

在构建立方体并用其他小立方体填充之后,我想构建一个矩阵来代表大块内的这些小立方体,这是因为我希望能够访问每个小立方体,在那里我需要改变颜色

是否可以使用此矩阵表示小立方体的结构?让我们说每个小立方体用-1表示,我的意思是矩阵的一行中的所有-1都是同一行的小立方体,而列中的所有-1都是同一列中的小立方体(大立方体内的邻居必须是矩阵内的邻居)。由于大立方体是3D形状,我希望这样的矩阵是具有行,列和深度度量的3D矩阵。深度可以代表我们拥有的不同小立方体的层,即在深度1处,我们有一组行和列,表示第一深度处的小立方体。之后我想迭代这个矩阵并将-1更改为代表某种颜色的其他数字。如何使用矩阵中的相应数字更改某个小立方体的颜色?例如,让索引(1,1,1)处的数字为0并让它代表黄色,如何将相应的立方体颜色更改为黄色?我考虑patch函数,但是如何将它应用到相应的多维数据集?

如何用小立方体填充立方体?而且,我如何构建上述矩阵?

这是一个用于在大的立方体内放置一个小立方体的代码,但是这将它放在中心,我试图用有组织的方式用小立方体填充大立方体,如提供的图片,但我不能&#39 ;弄清楚如何做到这一点。

clf;
figure(1);
format compact 
h(1) = axes('Position',[0.2 0.2 0.6 0.6]);

%These are the different 8 vertices of the cube, each is defined by its 3 x
%y z coordinates:
vert = [1 1 -1; 
        -1 1 -1; 
        -1 1 1; 
        1 1 1; 
        -1 -1 1;
        1 -1 1; 
        1 -1 -1;
        -1 -1 -1];
%These are the 6 faces of the cube, each is defined by connecting 4 of the
%available vertices:
fac = [1 2 3 4; 
       4 3 5 6; 
       6 7 8 5; 
       1 2 8 7; 
       6 7 1 4; 
       2 3 5 8];

% I defined a new cube whose length is 1 and centers at the origin.
vert2 = vert * .05;  
fac2 = fac;


patch('Faces',fac,'Vertices',vert,'Facecolor', 'w');  % patch function for the first big cube. 
axis([-1, 1, -1, 1, -1, 1]);
axis equal;

hold on;

patch('Faces', fac2, 'Vertices', vert2, 'FaceColor', 'r');
material metal;
alpha('color');
alphamap('rampdown');
view(3);

任何人都可以告诉我如何填充立方体并构建矩阵?

谢谢。

1 个答案:

答案 0 :(得分:3)

可以轻松地对代码进行一些轻微修改,以使用较小的多维数据集填充多维数据集。您已经有了将一个多维数据集放在中心的代码。你真正需要做的就是随机化基础小立方体的中心,用这个中心调整立方体的中心并将它放在更大的立方体中。您也可以随机化立方体的颜色。我们可以循环你想要多维数据集的次数,你可以为每个立方体生成随机中心位置以及随机颜色,并将它们放在最终的立方体上。

在代码末尾执行此操作:

hold on;
rng(123); %// Set seed for reproducibility
num_squares = 1000; %// Set total number of squares

%// For each square...
for idx = 1 : num_squares

    %// Take the base cube and add an offset to each coordinate
    %// Each coordinate will range from [-1,1]
    vert_new = bsxfun(@plus, vert2, 2*rand(1,3)-1);

    %// Generate a random colour for each cube
    color = rand(1,3);

    %// Draw the cube
    patch('Faces', fac, 'Vertices', vert_new, 'FaceColor', color);
end

%// Post processing
material metal;
alpha('color');
alphamap('rampdown');
view(3);

我们得到这张图片:

enter image description here

现在,如果你想建立这些所述坐标的3D矩阵,那很简单。只需要一个矩阵并在每次迭代时连接这些随机生成的坐标:

hold on;
rng(123); %// Set seed for reproducibility
num_squares = 1000; %// Set total number of squares

%// New - to store the coordinates
coords = [];

%// For remembering the colours
colors = [];

%// For each square...
for idx = 1 : num_squares

    %// Take the base cube and add an offset to each coordinate
    %// Each coordinate will range from [-1,1]
    vert_new = bsxfun(@plus, vert2, 2*rand(1,3)-1);

    %// New - For the coordinates matrix
    coords = cat(3, coords, vert_new);

    %// Generate a random colour for each cube
    color = rand(1,3);

    %// New - Save the colour
    colors = cat(1, colors, color);

    %// Draw the cube
    patch('Faces', fac, 'Vertices', vert_new, 'FaceColor', color);
end

%// Post processing
material metal;
alpha('color');
alphamap('rampdown');
view(3);

coords现在将成为一个3D矩阵,其中每个切片是一组代表一个立方体的3D坐标。同样,colors将代表一个2D矩阵,其中每一行都是与您绘制的多维数据集相关联的颜色。

如果您只想使用coordscolors重建此内容,则可以执行以下操作:

close all;
clf;
figure(1);
format compact 
h(1) = axes('Position',[0.2 0.2 0.6 0.6]);

patch('Faces',fac,'Vertices',vert,'Facecolor', 'w');  % patch function for the first big cube. 
axis([-1, 1, -1, 1, -1, 1]);
axis equal;

vert = [1 1 -1; 
        -1 1 -1; 
        -1 1 1; 
        1 1 1; 
        -1 -1 1;
        1 -1 1; 
        1 -1 -1;
        -1 -1 -1];

fac = [1 2 3 4; 
       4 3 5 6; 
       6 7 8 5; 
       1 2 8 7; 
       6 7 1 4; 
       2 3 5 8];

vert2 = vert * .05;  

%// For each square...
for idx = 1 : num_squares

    %// Take the base cube and add an offset to each coordinate
    %// Each coordinate will range from [-1,1]
    vert_new = coords(:,:,idx);

    %// Generate a random colour for each cube
    color = colors(idx,:);

    %// Draw the cube
    patch('Faces', fac, 'Vertices', vert_new, 'FaceColor', color);
end

%// Post processing
material metal;
alpha('color');
alphamap('rampdown');
view(3);

这应该通过使用您想要保存的矩阵重现相同的数字。