Подача всего объема кубика маленькими кубиками в MATLAB
Я построил полый куб в MATLAB, я хочу полностью заполнить его маленькими кубиками. Затем я хочу найти способ получить доступ к этим кубам и проложить через них пути, т. Е. Если к кубу x в данный момент обращаются, должен быть способ узнать, каковы его правые, левые, верхние, нижние, передние и задние ближайшие соседи ( ближайшие соседи = кубы непосредственно рядом с текущим кубом). Я думаю, что у нас есть 6 соседей, потому что у нас есть 6 различных граней куба.
Зная ближайший куб в каждом направлении, путь через кубы можно определить как последовательность шагов (например, справа, слева, слева, сверху, справа, спереди). Я думаю, чтобы иметь возможность получить доступ к каждому маленькому кубу и перейти к ближайшим, нам нужно представить маленькие кубы в матрице (возможно, 3D), где, если маленький кубик имеет соседний куб x справа, то в матрице x появится в столбце рядом с текущим столбцом маленького куба. Также, если есть прямой сосед в другом глубинном слое (те же координаты x, y, но разные координаты z, например, передние и задние соседи), это должно быть указано. Есть ли более простой способ определить соседей?
Я получил код отrayryeng (Сборка полого куба и подача его маленькими кубиками в MATLAB) случайным образом заполнить множество маленьких кубиков внутри большого и построить трехмерную матрицу, где каждый срез матрицы (глубина) представляет один из маленьких кубиков, а строки и столбцы каждого среза (8 строк и 3 столбца) представляют xyz координаты вершин каждого маленького кубика. Пожалуйста, посмотрите на ссылку на вопрос, которую я предоставил, чтобы увидеть код.
Я хочу сделать две модификации в коде,
1. Заполните большой кубик маленькими кубиками организованным образом, а не случайным образом.
2- отрегулируйте трехмерную матрицу, чтобы представить, как маленькие кубики соседствуют друг с другом.
Я попытался настроить код в связанном вопросе, чтобы заполнить куб организованным способом. Это мое испытание (я добавил if if в цикл for),
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', 'EdgeColor', 'none');
material metal;
alpha('color');
alphamap('rampdown');
%view(3);
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]
if (idx==1)
vert_new = bsxfun(@plus, vert2, [.01 .01 .01]);
else
vert_new = bsxfun (@plus, vert_new,[.01 .01 .01] );
end
%// 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,'EdgeColor', 'none');
end
%// Post processing
material metal;
alpha('color');
alphamap('rampdown');
view(3);
Но я получаю результат, подобный показанному на следующей картинке,
Может кто-нибудь сказать мне, как решить эту проблему и построить 3D-матрицу (или любой другой более простой способ представить соседей каждого куба)?
РЕДАКТИРОВАТЬ: подробнее о проблеме соседа малого куба. Подумайте о наличии куба C где-нибудь внутри большого куба. Пусть позиция куба будет (.5, .5, .5), которую мы можем рассматривать как центр куба. Тогда у этого куба будет 6 соседних кубов (расположенных непосредственно рядом с ним) с 2 соседями на ось. Итак, для куба (.5, .5, .5) имеем
сосед оси x справа от C (.5 + смещение, .5, .5)
сосед оси x слева от C (.5-смещение, .5, .5)
сосед оси Y к вершине C (.5, .5 + смещение, .5)
сосед оси Y к основанию C (.5, .5-смещение, .5)
Ось z соседствует на одну глубину после C (.5, .5, .5 + смещение)
Ось z соседствует на одну глубину до C (.5, .5, .5-смещение)
где смещение можно рассматривать как расстояние между центром куба и любой из его граней. Это просто объяснение, чтобы прояснить идею, это не должно быть реализовано таким же образом. Я надеюсь, что это понятно, я был бы признателен за любую помощь в построении этой матрицы соседства.
Благодарю.