我想构建一个具有x,y和z尺寸的空心立方体,并用许多小立方体填充其体积。以下图像与我想要的相似,
但是,我想使用小立方体而不是小球体。
在构建立方体并用其他小立方体填充之后,我想构建一个矩阵来代表大块内的这些小立方体,这是因为我希望能够访问每个小立方体,在那里我需要改变颜色。
是否可以使用此矩阵表示小立方体的结构?让我们说每个小立方体用-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);
任何人都可以告诉我如何填充立方体并构建矩阵?
谢谢。
答案 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);
我们得到这张图片:
现在,如果你想建立这些所述坐标的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矩阵,其中每一行都是与您绘制的多维数据集相关联的颜色。
如果您只想使用coords
和colors
重建此内容,则可以执行以下操作:
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);
这应该通过使用您想要保存的矩阵重现相同的数字。