Entiendo que esta es una respuesta tardía, pero sigue siendo válida en caso de que alguien más esté buscando hacer lo mismo.
Suponiendo que se está trazando cubos (/ sus bordes), una alternativa a las respuestas ya proporcionadas es utilizar el código 'plotcube' de Oliver: plotcube
La ventaja de esta solución es que se puede:
- cambiar la transparencia de las caras (FaceAlpha), y/o,
- cambiar la transparencia de los bordes (EdgeAlpha), y/o,
- cambiar el color de las líneas (Edge Color).
Todos estos pueden ser constantes o variables. (por ejemplo, color de borde fijo, o un color que cambia con el valor Z, etc.)
Para agregar la funcionalidad de 2. y 3. (arriba) cambie el 'cellfun (@patch ...'Sección de código de Olivers, añadiendo en las cuatro líneas adicionales de código como sigue: (sustituir toda la sección cellfun
con esto, incluyendo el nuevo 'EdgeAlpha' y 'líneas 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)...
);
Para obtener más información sobre 'parche', consulte la documentación patch.
Una nota importante: - para modelos grandes (muchos cubos) esto es muy lento de ejecutar. p. ejecutar esta función 'plotcube' en un bucle 'for' en MATLAB a lo largo de miles de bloques. Creo que esto proviene de llamar a la función 'parche' varias veces. Una mejor solución sería vectorizar; para poner todos tus puntos (vértices/caras/lo que sea) juntos en una matriz única primero y luego llamar a la función @patch solo una vez (no 'for' loop). Esto requeriría cambiar el código de alguna manera para actualizar todos los datos XYZ.
Espero que ayude a alguien.
Este es el código 'plotcube' en caso de que el enlace al código original por Oliver rompe algún día:
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);
Esa es una perspectiva muy raro. ¿Que es eso? ¿Perspectiva? Isométrico? ¿Algo más? – Rook