web-dev-qa-db-ja.com

Matlabで3Dグリッド(キューブ)をプロットする方法

こんにちは私はそれに線のある透明な立方体グリッドをプロットしたいと思います。このようなもの: enter image description here

ただし、2Dグリッドのみを描画することに成功しました。

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

私はMatlab R2009bを使用しています。これをmatlabでプロットすることが不可能な場合は、私が使用できるソフトウェアをお勧めします。

17
Func

いくつかの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

おそらく線のプロパティを変更してグリッドを透明にする必要があるだけです。これを実現するためにアルファ値を変更することはできないと思います。お役に立てば幸いです。

13

このベクトル化されたソリューションを考えてみましょう。 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

19
Amro

スティーブンの答えのよりベクトル化されたバージョンは次のようになるでしょう:

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は現在(私の知る限り)透過線をサポートしていません。本当に透明にする必要がある場合は、「パッチ」を使用することをお勧めします。

12
Raf

これは返信が遅いことを理解していますが、他の誰かが同じことをしているのを見ている場合でもそれは有効です。

立方体(/そのエッジ)をプロットしていると仮定すると、すでに提供されている回答の代わりに、オリバーの 'plotcube'コードを使用することができます。 plotcube

このソリューションの利点は、次のことができることです。

  1. 顔の透明度を変更する(FaceAlpha)、および/または、
  2. エッジの透明度を変更する(EdgeAlpha)、および/または、
  3. 線の色を変更します(EdgeColor)。

これらはすべて定数または変数にすることができます。 (例:固定エッジの色、またはZ値によって変化する色など)

2.および3.(上記)の機能を追加するには、Oliversコードの 'cellfun(@patch ...'セクションを変更し、次のように4行のコードを追加します:(cellfun全体を置き換えますこれを含むセクション;新しい 'EdgeAlpha'および 'EdgeColor'行を含む):

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

'patch'の詳細については、 patch のドキュメントを参照してください。

重要な注意:-大きなモデル(多くのキューブ)の場合、これは実行に非常に時間がかかります。例えばこの 'plotcube'関数をMATLABの 'for'ループで実行すると、数千のブロックが実行されます。これは 'patch'関数を複数回呼び出すことによるものだと思います。より良い解決策はベクトル化することです。すべてのポイント(頂点/面/何でも)を1つの行列にまとめてから、@ patch関数を1回だけ呼び出します(「for」ループはありません)。これには、すべてのXYZデータを更新するためにコードを変更する必要があります。

それが誰かのお役に立てば幸いです。

Oliverによる元のコードへのリンクがいつか壊れる場合の 'plotcube'コードは次のとおりです。

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

color = [0.65、0.65、0.65]と設定すると、内側の線を透明にできます。また、内側の線に破線スタイルを使用し、境界に実線を使用して、3Dオブジェクトのようにすることができます。

私のソフトウェアパッケージでは、mesh3関数をコード化して、3次元テンソル積メッシュをプロットします。

0
Long Chen
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
user7344151