2011-09-05 27 views
16

こんにちは、透明なキューブ型グリッドを線でプロットしたいと思います。このような何か: enter image description hereMatlabで3Dグリッド(立方体)をプロットする方法

はしかし、私は唯一の2Dグリッドを描画するために管理:

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

私はMatlabのR2009bを使用します。 これをMATLABにプロットすることができない場合は、私が使うことができるソフトウェアを私にお勧めできますか?

+1

はここでオリバーによって、元のコードへのリンクはいつか壊れる場合の「plotcube」のコードです。それは何ですか?展望?等尺性?他に何か? – Rook

答えて

12

あなたはループの数を気にしない場合は、このような何かが動作します:

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 

あなただけおそらくラインプロパティを変更することで、グリッドを透明にする必要があります、私はあなたができるとは思いませんこれを達成するためにアルファ値を変更してください。希望があれば助かります。

+0

+1私が欲しかったのです。 – Func

8

シュテファン答え、次のことかもしれないのより多くのベクトル化バージョン:

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

+0

+ ____________ 1 – Func

+0

私は回転したキューブ(グリッドではない)を描画するためにコードを使用しようとしています。なぜ最後の3行が彼らの方法であるのか説明してもらえますか? –

18

このベクトル化された解を考えてみましょう。あなたは色= [0.65、0.65、0.65]を設定することにより、透明の内側の線のようなものを作ることができ

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

:それは、単一のグラフィックオブジェクトを作成することadvantageを持っています。また、内部線にはダッシュ線スタイルを使用し、境界線には実線を使用して3Dオブジェクトのようにすることができます。

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

0

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

このソリューションの利点は、あなたができることです::

すでに提供解答する代わりに、オリバーから「plotcube」コードを使用することで、あなたは(/そのエッジ)キューブをプロットしていると仮定すると、

  1. 変更面(FaceAlpha)の透明度、及び/又は、
  2. 変更縁(EdgeAlpha)の透明度、及び/又は、
  3. 変更線の色(エッジ色)。

これらはすべて定数または変数です。 (例:固定端の色、またはZ値などで変化する色)

2.および3.の機能を追加するには、 'cellfun(@patch ...)を変更します。':(; 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)... 
); 

詳細情報については上の新しい含めこれで全体cellfunセクションを置き換える)、次のようにコードの4つの余分な行に追加オリヴァーズ・コード内のセクション、』 'patch' patchのドキュメントを参照してください。

重要なお知らせ: - 大型モデル(多数の立方体)の場合、これは実行が非常に遅いです。例: 何千ものブロックにわたってMATLABの 'for'ループでこの 'plotcube'関数を実行します。私はこれが 'パッチ'機能を複数回呼び出すことであると信じています。 より良い解決策はベクトル化することです。あなたのすべての点(頂点/面/何か)を最初に単一の行列に入れてから、@ patch関数を1回だけ呼び出します( 'for'ループはありません)。これにより、コードを何らかの形で変更してすべてのXYZデータを更新する必要があります。

私は誰かを助けることを願っています。非常に奇妙な視点をある

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
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) 
+1

コードに加えて、この説明が役立ちます。 –

関連する問題