How to plot 3D grid (cube) in Matlab

前端 未结 6 1210
太阳男子
太阳男子 2020-12-05 08:13

Hi I would like to plot transparent cube-shaped grid with lines in it. Something like this: \"enter

相关标签:
6条回答
  • 2020-12-05 08:35

    A more vectorized version of Stephen's answer might be the following:

    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);
    

    Unfortunately, MATLAB does not currently support transparent lines (to my knowledge). If you really need them to be transparent I'd suggest using 'patch'.

    0 讨论(0)
  • 2020-12-05 08:36

    If you don't mind a few for loops, something like this will work:

    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
    

    You will just need to make the grid transparent by probably changing line properties, I don't think you can change alpha values to accomplish this. Hope that is helpful.

    0 讨论(0)
  • 2020-12-05 08:38

    Consider this vectorized solution. It has the advantage that it creates a single graphic object:

    %# 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

    0 讨论(0)
  • 2020-12-05 08:47
    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)
    
    0 讨论(0)
  • 2020-12-05 08:50

    you can make the inside line kind of transparent by setting color = [0.65, 0.65, 0.65]. And you can use dash line style for interior lines and solid lines for boundary to make it more like a 3-D object.

    In my software package, I code a mesh3 function to plot the 3-D tensor product meshes.

    0 讨论(0)
  • 2020-12-05 08:55

    I understand this is a late reply but it is still valid in case anyone else is looking at doing the same thing.

    Assuming you are plotting cubes (/their edges), an alternative to the answers already provided is to use the 'plotcube' code from Oliver: plotcube

    The advantage of this solution is that you can:

    1. Change the transparency of the faces (FaceAlpha), and/or,
    2. Change the transparency of the edges (EdgeAlpha), and/or,
    3. Change the colour of the lines (EdgeColor).

    All of these can be constants, or variables. (e.g. fixed edge colour, or a colour that changes with Z-value etc.)

    To add in functionality of 2. and 3. (above) change the 'cellfun(@patch...' section in Olivers code, adding in the four extra lines of code as follows: (replace the whole cellfun section with this; including the new 'EdgeAlpha' and 'EdgeColor' lines):

    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)...
      );
    

    For more info on 'patch' please see patch documentation.

    An important note: - for large models (many cubes) this is very slow to run. e.g. running this 'plotcube' function in a 'for' loop in MATLAB over thousands of blocks. I believe this is from calling the 'patch' function multiple times. A better solution would be to vectorise; to put all your points (vertices/faces/whatever) together in a single matrix first and then call the @patch function only once (no 'for' loop). This would require changing the code somehow to update all the XYZ data.

    I hope that helps someone.

    Here is the 'plotcube' code in case the link to the original code by Oliver breaks someday:

    function plotcube(varargin)
    % PLOTCUBE - Display a 3D-cube in the current axes
    %
    %   PLOTCUBE(EDGES,ORIGIN,ALPHA,COLOR) displays a 3D-cube in the current axes
    %   with the following properties:
    %   * EDGES : 3-elements vector that defines the length of cube edges
    %   * ORIGIN: 3-elements vector that defines the start point of the cube
    %   * ALPHA : scalar that defines the transparency of the cube faces (from 0
    %             to 1)
    %   * COLOR : 3-elements vector that defines the faces color of the cube
    %
    % Example:
    %   >> plotcube([5 5 5],[ 2  2  2],.8,[1 0 0]);
    %   >> plotcube([5 5 5],[10 10 10],.8,[0 1 0]);
    %   >> plotcube([5 5 5],[20 20 20],.8,[0 0 1]);
    
    % Default input arguments
    inArgs = { ...
      [10 56 100] , ... % Default edge sizes (x,y and z)
      [10 10  10] , ... % Default coordinates of the origin point of the cube
      .7          , ... % Default alpha value for the cube's faces
      [1 0 0]       ... % Default Color for the cube
      };
    
    % Replace default input arguments by input values
    inArgs(1:nargin) = varargin;
    
    % Create all variables
    [edges,origin,alpha,clr] = deal(inArgs{:});
    
    XYZ = { ...
      [0 0 0 0]  [0 0 1 1]  [0 1 1 0] ; ...
      [1 1 1 1]  [0 0 1 1]  [0 1 1 0] ; ...
      [0 1 1 0]  [0 0 0 0]  [0 0 1 1] ; ...
      [0 1 1 0]  [1 1 1 1]  [0 0 1 1] ; ...
      [0 1 1 0]  [0 0 1 1]  [0 0 0 0] ; ...
      [0 1 1 0]  [0 0 1 1]  [1 1 1 1]   ...
      };
    
    XYZ = mat2cell(...
      cellfun( @(x,y,z) x*y+z , ...
        XYZ , ...
        repmat(mat2cell(edges,1,[1 1 1]),6,1) , ...
        repmat(mat2cell(origin,1,[1 1 1]),6,1) , ...
        'UniformOutput',false), ...
      6,[1 1 1]);
    
    
    cellfun(@patch,XYZ{1},XYZ{2},XYZ{3},...
      repmat({clr},6,1),...
      repmat({'FaceAlpha'},6,1),...
      repmat({alpha},6,1)...
      );
    
    view(3);
    
    0 讨论(0)
提交回复
热议问题