如何在Matlab中绘制3D网格(立方体)

时间:2011-09-05 14:04:08

标签: matlab grid plot cube

您好我想绘制带有线条的透明立方体网格。像这样的东西: enter image description here

但是,我只设法绘制2D网格:

[X,Y] = meshgrid(-8:.5:8);
Z = X+1;
surf(X,Y,Z)

我使用Matlab R2009b。 如果不可能在matlab中绘制这个,你可以向我推荐一个我可以使用的软件。

6 个答案:

答案 0 :(得分:19)

考虑这个矢量化解决方案。它有advantage,它创建一个图形对象:

%# these don't all have to be the same
x = -8:2:8; y = -8:2:8; z = -8:2:8;

[X1 Y1 Z1] = meshgrid(x([1 end]),y,z);
X1 = permute(X1,[2 1 3]); Y1 = permute(Y1,[2 1 3]); Z1 = permute(Z1,[2 1 3]);
X1(end+1,:,:) = NaN; Y1(end+1,:,:) = NaN; Z1(end+1,:,:) = NaN;
[X2 Y2 Z2] = meshgrid(x,y([1 end]),z);
X2(end+1,:,:) = NaN; Y2(end+1,:,:) = NaN; Z2(end+1,:,:) = NaN;
[X3 Y3 Z3] = meshgrid(x,y,z([1 end]));
X3 = permute(X3,[3 1 2]); Y3 = permute(Y3,[3 1 2]); Z3 = permute(Z3,[3 1 2]);
X3(end+1,:,:) = NaN; Y3(end+1,:,:) = NaN; Z3(end+1,:,:) = NaN;

%#figure('Renderer','opengl')
h = line([X1(:);X2(:);X3(:)], [Y1(:);Y2(:);Y3(:)], [Z1(:);Z2(:);Z3(:)]);
set(h, 'Color',[0.5 0.5 1], 'LineWidth',1, 'LineStyle','-')

%#set(gca, 'Box','on', 'LineWidth',2, 'XTick',x, 'YTick',y, 'ZTick',z, ...
%#  'XLim',[x(1) x(end)], 'YLim',[y(1) y(end)], 'ZLim',[z(1) z(end)])
%#xlabel x, ylabel y, zlabel z
axis off
view(3), axis vis3d
camproj perspective, rotate3d on

screenshot

答案 1 :(得分:13)

如果你不介意一些for循环,那么这样的东西就可以了:

clf
figure(1)
for g = 0:.2:2
for i = 0:.2:2

   plot3([g g], [0 2], [i, i])
   hold on
end
end

for g = 0:.2:2
for i = 0:.2:2

   plot3([0 2], [g g], [i, i])
   hold on
end
end

for g = 0:.2:2
for i = 0:.2:2

   plot3([i i], [g g], [0 2])
   hold on
end
end

你只需要通过改变线属性来使网格透明,我认为你不能改变alpha值来实现这一点。希望这很有帮助。

答案 2 :(得分:9)

斯蒂芬答案的更多矢量化版本可能如下:

i = 0:0.2:2;
[X Y] = meshgrid(i,i);                         
x = [X(:) X(:)]';                                
y = [Y(:) Y(:)]';
z = [repmat(i(1),1,length(x)); repmat(i(end),1,length(x))];
col = 'b';
hold on;
plot3(x,y,z,col);                                         
plot3(y,z,x,col);
plot3(z,x,y,col);

不幸的是,MATLAB目前不支持透明线(据我所知)。如果你真的需要它们透明,我建议使用'patch'。

答案 3 :(得分:1)

我知道这是一个迟到的回复,但如果其他人正在考虑做同样的事情,它仍然有效。

假设您正在绘制立方体(/它们的边缘),已经提供的答案的替代方法是使用Oliver的“plotcube”代码: plotcube

此解决方案的优点是您可以:

  1. 更改面部的透明度(FaceAlpha)和/或
  2. 更改边缘的透明度(EdgeAlpha)和/或
  3. 更改线条的颜色(EdgeColor)。
  4. 所有这些都可以是常量或变量。 (例如固定边缘颜色,或随Z值变化的颜色等。)

    添加2.和3的功能。(上面)更改Olivers代码中的'cellfun(@ patch ...'部分,添加以下四行代码:(替换整个{{1这个部分;包括新的'EdgeAlpha'和'EdgeColor'行:

    cellfun

    有关“补丁”的详情,请参阅patch文档。

    重要说明: - 对于大型模型(许多立方体),运行速度非常慢。 例如在数以千计的块中在MATLAB中的'for'循环中运行这个'plotcube'函数。我相信这是多次调用'patch'函数。 更好的解决方案是矢量化;首先将所有点(顶点/面/任何)放在一个矩阵中,然后只调用一次@patch函数(没有'for'循环)。这需要以某种方式更改代码以更新所有XYZ数据。

    我希望能帮助别人。

    以下是'plotcube'代码,以防有一天Oliver链接到原始代码:

    cellfun(@patch,XYZ{1},XYZ{2},XYZ{3},...
      repmat({clr},6,1),...
      repmat({'FaceAlpha'},6,1),...
      repmat({alpha},6,1),...
      repmat({'EdgeAlpha'},6,1),...
      repmat({0.2},6,1),...      % Set this value to whatever you want; even a variable / matrix
      repmat({'EdgeColor'},6,1),...  
      repmat({'black'},6,1)...
      );
    

答案 4 :(得分:0)

你可以通过设置color = [0.65,0.65,0.65]使内线变得透明。并且您可以对内部线使用虚线样式,对边界使用实线,使其更像3-D对象。

在我的软件包中,我编写了一个mesh3函数来绘制三维张量积网格。

答案 5 :(得分:0)

clear all 
close all
clc
Nx=11;
Ny=11;
Nz=11;
clf
hold on
[i,j]=meshgrid(1:Nx,1:Ny);
k=zeros(Ny,Nx)+Nz;
surf(i,j,k)
[i,k]=meshgrid(1:Nx,1:Nz);
j=zeros(Nz,Nx)+Ny;
surf(i,j,k)
[j,k]=meshgrid(1:Ny,1:Nz);
i=zeros(Nz,Ny)+Nx;
surf(i,j,k)
[i,j]=meshgrid(1:Nx,1:Ny);
k=zeros(Ny,Nx)+1;
surf(i,j,k)
[i,k]=meshgrid(1:Nx,1:Nz);
j=zeros(Nz,Nx)+1;
surf(i,j,k)
[j,k]=meshgrid(1:Ny,1:Nz);
i=zeros(Nz,Ny)+1;
surf(i,j,k)
view(30,30)