Я понимаю, что это поздний ответ, но он все еще действителен, если кто-то еще пытается сделать то же самое.
Предполагая, что вы строите кубы (/ их ребра), альтернатива уже ответампри условии использования кода plotcube от Оливера: plotcube
Преимущество этого решения заключается в том, что вы можете:
- Изменить прозрачность граней(FaceAlpha) и / или,
- Изменение прозрачности краев (EdgeAlpha), и / или,
- Изменение цвета линий (EdgeColor).
Все они могут быть константами или переменными.(например, цвет фиксированного края или цвет, который изменяется в зависимости от значения Z и т. д.)
Чтобы добавить функциональные возможности 2. и 3. (выше), измените раздел 'cellfun (@patch ...' вКод Оливера, добавив в него четыре дополнительные строки кода следующим образом: (замените весь раздел 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 .
Важное примечание: - для больших моделей (много кубов) запуск выполняется очень медленно, например, при запуске этой функции plotcube вfor 'loop в MATLAB для более чем тысячи блоков. Я полагаю, что это происходит из-за многократного вызова функции' patch '. Лучшим решением было бы векторизация; сначала собрать все свои точки (вершины / грани / что угодно) в одну матрицуа затем вызовите функцию @patch только один раз (без цикла 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);