Tôi hiểu đây là câu trả lời trễ nhưng vẫn hợp lệ trong trường hợp bất kỳ ai khác đang xem xét thực hiện tương tự.
Giả sử bạn đang vẽ hình khối (/ cạnh của họ), một thay thế cho câu trả lời đã được cung cấp là sử dụng 'plotcube' mã từ Oliver: plotcube
Ưu điểm của giải pháp này là bạn có thể:
- Thay đổi tính minh bạch của khuôn mặt (FaceAlpha), và/hoặc,
- Thay đổi tính minh bạch của các cạnh (EdgeAlpha), và/hoặc,
- Thay đổi màu sắc của các dòng (Edge Màu).
Tất cả đều có thể là hằng số hoặc biến. (ví dụ: màu cạnh cố định hoặc màu thay đổi với giá trị Z, v.v.)
Để thêm vào chức năng của 2. và 3. (ở trên) thay đổi 'cellfun (@patch ...'Phần trong mã Olivers, thêm vào bốn dòng thêm mã như sau: (thay thế toàn bộ phần cellfun
với điều này; bao gồm cả mới 'EdgeAlpha' và 'EdgeColor' lines):
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)...
);
Để biết thêm về 'patch', vui lòng xem tài liệu patch.
Lưu ý quan trọng: - đối với các kiểu máy lớn (nhiều hình khối) điều này rất chậm để chạy. ví dụ: chạy hàm 'plotcube' này trong một vòng lặp 'for' trong MATLAB qua hàng nghìn khối. Tôi tin rằng điều này là từ gọi chức năng 'vá' nhiều lần. Một giải pháp tốt hơn sẽ là vectơ; để đặt tất cả các điểm của bạn (đỉnh/mặt/bất cứ điều gì) với nhau trong một ma trận đơn đầu tiên và sau đó gọi hàm @patch chỉ một lần (không có 'cho' vòng lặp). Điều này sẽ yêu cầu thay đổi mã bằng cách nào đó để cập nhật tất cả các dữ liệu XYZ.
Tôi hy vọng rằng sẽ giúp ai đó.
Đây là 'plotcube' mã trong trường hợp liên kết đến mã gốc của Oliver phá vỡ một ngày nào đó:
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);
Đó là một quan điểm rất lạ. Đó là gì? Phối cảnh? Isometric? Thứ gì khác? – Rook