在Matlab中使用补丁绘制多个3D矩形

时间:2015-01-20 13:11:01

标签: matlab plot patch

我有多个矩形的x,y和z坐标'角落。所有坐标都在一个矩阵中;按x,y,z排序。每三列包含一个矩形的四个角坐标。我想在一个图中显示所有矩形。但是,它不显示任何矩形。这是我的代码:

%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

此代码工作正常...     [〜,c] =大小(坐标);     对于i = 1:3:c         补丁(坐标(:,i)中,坐标(:,I + 1),坐标(:,I + 2))         坚持,稍等     端

2 个答案:

答案 0 :(得分:2)

如果我是对的,你正在寻找类似以下解决方案的东西。这个想法来自Amro的回答here

代码首先创建具有起始和终止顶点的向量。然后它创建一个矩阵,用起始顶点保持线条,停止顶点并插入nan线。然后它使用patch绘制曲面并使面部不可见。请注意,对于许多顶点,这个"浪费" 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')

剧情

enter image description here

答案 1 :(得分: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

如果这不起作用,请发布您的数据示例,以便我可以尝试。

注意:不要在Matlab中使用i作为变量名,因为它是虚构的单位。