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:
- modificare la trasparenza dei volti (FaceAlpha), e/o,
- modificare la trasparenza dei bordi (EdgeAlpha), e/o,
- 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);
Questo è un punto di vista molto strano. Cos'è quello? Prospettiva? Isometrico? Qualcos'altro? – Rook