我有多个矩形的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)) 坚持,稍等 端
答案 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')
答案 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
作为变量名,因为它是虚构的单位。