2011-09-05 17 views
16

Ciao, mi piacerebbe tracciare una griglia a forma di cubo trasparente con le linee al suo interno. Qualcosa di simile a questo: enter image description hereCome tracciare una griglia 3D (cubo) in Matlab

Tuttavia, ho solo riuscito a disegnare una griglia 2D:

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

io uso Matlab R2009b. Se è impossibile tracciare questo in matlab, mi può consigliare un software che potrei usare.

+1

Questo è un punto di vista molto strano. Cos'è quello? Prospettiva? Isometrico? Qualcos'altro? – Rook

risposta

12

Se non ti dispiace un paio di cicli for, qualcosa di simile a questo lavoro:

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 

Avrete solo bisogno di fare la griglia trasparente probabilmente cambiando proprietà della linea, non si pensa di poter cambiare i valori alfa per realizzare questo. Spero che sia utile.

+0

+1 Questo è quello che volevo. – Func

8

Una versione più vettorizzati della risposta di Stefano potrebbe essere il seguente:

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

Purtroppo, MATLAB attualmente non supporta linee trasparenti (a mia conoscenza). Se hai davvero bisogno che siano trasparenti, ti suggerisco di usare "patch".

+0

+ ____________ 1 – Func

+0

Sto provando a utilizzare il codice per disegnare un cubo ruotato (non la griglia). Ti piacerebbe spiegare perché le ultime 3 righe sono come sono? –

18

Considerare questa soluzione vettoriale. Ha il advantage che crea un singolo oggetto grafico:

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

si può fare la linea di tipo interno trasparente impostando color = [0.65, 0.65, 0.65]. E puoi usare lo stile lineetta per le linee interne e le linee continue per i confini per renderlo più simile a un oggetto 3D.

Nel mio pacchetto software, codifico una funzione mesh3 per tracciare le reti di prodotti tensoriali 3D.

0

Capisco che questa è una risposta tardiva, ma è ancora valida nel caso in cui qualcun altro stia cercando di fare la stessa cosa.

Supponendo che si sta tramando cubetti (/ i bordi), un'alternativa alle risposte già fornite è quello di utilizzare il codice 'plotcube' da Oliver: plotcube

Il vantaggio di questa soluzione è che è possibile:

  1. modificare la trasparenza dei volti (FaceAlpha), e/o,
  2. modificare la trasparenza dei bordi (EdgeAlpha), e/o,
  3. Cambiare il colore delle linee (bordo Colore).

Tutte queste possono essere costanti o variabili. (colore del bordo ad esempio fisso, o un colore che cambia con valore Z ecc)

Per aggiungere funzionalità di 2. e 3. (sopra) cambiare il 'cellfun (@patch ...'Sezione nel codice Oliver, aggiungendo nelle quattro righe in più di codice come segue: (sostituire l'intero cellfun sezione con questo, compreso il nuovo 'EdgeAlpha' e 'linee 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)... 
); 

Per più informazioni 'patch' vedi la documentazione patch.

Una nota importante: - per i modelli di grandi dimensioni (molti cubi) questo è molto lento da eseguire. ad es. eseguendo questa funzione 'plotcube' in un ciclo 'for' in MATLAB su migliaia di blocchi. Credo che questo sia da chiamare la funzione 'patch' più volte. Una soluzione migliore sarebbe quella di vettorializzare; per mettere tutti i tuoi punti (vertici/facce/qualunque) insieme in una singola matrice e poi chiamare la funzione @patch una sola volta (no 'for' loop). Ciò richiederebbe di cambiare il codice in qualche modo per aggiornare tutti i dati XYZ.

Spero che questo aiuti qualcuno.

Ecco il codice 'plotcube' nel caso in cui il link al codice originale di Oliver rompe un giorno:

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

Alcune spiegazioni, oltre al codice, renderebbero questa risposta più utile. –

Problemi correlati