Заговор несколько 3D прямоугольники с помощью патча в Matlab

Обновить

November 2018

Просмотры

1.2k раз

2

У меня есть х, у, г координаты углов и несколько областей. Все координаты находятся в одной матрице; заказать как х, у, г. Каждые три столбца содержат один четыре угловых координат прямоугольника. Я хочу, чтобы показать все прямоугольники на одном участке. Однако, он не показывает какой-либо из прямоугольников. Вот мой код:

%Coordinates(1,3*i-2:3*i) = top left corners' x y z coordinates
%Coordinates(2,3*i-2:3*i) = down left corners' x y z coordinates
%Coordinates(3,3*i-2:3*i) = down right corners' x y z coordinates
%Coordinates(4,3*i-2:3*i) = top right corners' x y z coordinates

Этот код работает отлично ... [~, с] = размер (координаты); для я = 1: 3: с накладными (координатами (:, I), в координатах (:, г + 1), координаты (:, I + 2)) держать на конце

2 ответы

2

Если я прав, то вы ищете Somthing как следующее решение. Идея взята из ответа Amro в здесь .

идея

Код сначала создает векторы с начала и остановки вершин. Затем он создает матрицу , проведение линий с начальной вершиной, остановить вершину и вставляет nanстроку. Затем он использует patchдля построения поверхности и делает лицо невидимым. Обратите внимание, что для reeeaally многих вершин, это «отходы» часть памяти для nansно команда патча довольно быстро, так как это создает только один объект.

Код

% Sample coordinates
coord = [ 1  -1.3  -1;...
         -1  -1.3  -1;...
         -1  -1.3   1;...
          1  -1.3   1;...
          1   1.3  -1;...
         -1   1.3  -1;...
         -1   1.3   1;...
          1   1.3   1;...
         -1.3   1  -1;...
         -1.3  -1  -1;...
         -1.3  -1   1;...
         -1.3   1   1;...
          1.3   1  -1;...
          1.3  -1  -1;...
          1.3  -1   1;...
          1.3   1   1;...
          1    -1  -1.3;...
         -1    -1  -1.3;...
         -1     1  -1.3;...
          1     1  -1.3;...
          1    -1   1.3;...
         -1    -1   1.3;...
         -1     1   1.3;...
          1     1   1.3];

nlines = size(coord, 1);
% Vectors for vertices
X = zeros(2, nlines);
Y = zeros(2, nlines);
Z = zeros(2, nlines);
C = zeros(1, nlines);
% One iteration per vertex
for ii = 1:nlines
    % Here comes the edge back to the first vertex
    if mod(ii,4) == 0
        X(1, ii) = coord(ii, 1);
        Y(1, ii) = coord(ii, 2);
        Z(1, ii) = coord(ii, 3);

        X(2, ii) = coord(ii-3, 1);
        Y(2, ii) = coord(ii-3, 2);
        Z(2, ii) = coord(ii-3, 3);

    % Here come all other edges
    else
        X(1, ii) = coord(ii, 1);
        Y(1, ii) = coord(ii, 2);
        Z(1, ii) = coord(ii, 3);

        X(2, ii) = coord(ii+1, 1);
        Y(2, ii) = coord(ii+1, 2);
        Z(2, ii) = coord(ii+1, 3);
    end
    % One color for each rectangle
    C(ii) = floor((ii-1)/4);
end
% Insert nans between lines
X(end+1, :) = nan;
Xf = X(:);
Y(end+1, :) = nan;
Yf = Y(:);
Z(end+1, :) = nan;
Zf = Z(:);
% Setup patch matrix
p = [Xf, Yf, Zf];                   
% Prepare color matrix
r = repmat(C.', 1, 3)';
clr = r(:);
% Make a figure
f = figure;
% Plot patch
surface(p(:,[1 1]), p(:,[2 2]), p(:,[3 3]), [clr clr], ...
    'EdgeColor',    'flat', ....
    'FaceColor',    'None')

grid on
view([55, 36]);

xlabel('X')
ylabel('Y')
zlabel('Z')

участок

введите описание изображения здесь

0

Я до сих пор точка в полной мере понять, как сохраняются ваши данные, но позвольте мне попробовать с тем, что я понял:

[~,c] = size(coordinates);
hold on
for ii = 1:1:c/4
    patch(coordinates(1+(ii-1)*4:4+(ii-1)*4,1),coordinates(1+(ii-1)*4:4+(ii-1)*4,2),coordinates(1+(ii-1)*4:4+(ii-1)*4,3));
end

Если это не работает, пожалуйста, напишите пример ваших данных, так что я могу на самом деле попробовать.

Примечание: не используйте в iкачестве имени переменной в Matlab, как это мнимая единица.