2011-09-05 87 views
16

Xin chào Tôi muốn vẽ ô lưới hình khối trong suốt với các đường trong đó. Một cái gì đó như thế này: enter image description hereCách vẽ ô lưới 3D (khối lập phương) trong Matlab

Tuy nhiên, tôi chỉ cố gắng vẽ một lưới 2D:

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

tôi sử dụng Matlab R2009b. Nếu không thể vẽ điều này trong MATLAB, bạn có thể giới thiệu cho tôi một phần mềm mà tôi có thể sử dụng không.

+1

Đó là một quan điểm rất lạ. Đó là gì? Phối cảnh? Isometric? Thứ gì khác? – Rook

Trả lời

12

Nếu bạn không nhớ một vài cho vòng, một cái gì đó như thế này sẽ làm việc:

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 

Bạn sẽ chỉ cần làm cho lưới trong suốt bởi lẽ thay đổi thuộc tính dòng, tôi không nghĩ rằng bạn có thể thay đổi giá trị alpha để thực hiện điều này. Hy vọng đó là hữu ích.

+0

+1 Đó là những gì tôi muốn. – Func

8

Một phiên bản vectorized hơn về câu trả lời của Stephen có thể là như sau:

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

Thật không may, MATLAB hiện không hỗ trợ dòng trong suốt (theo tôi biết). Nếu bạn thực sự cần chúng trong suốt, tôi khuyên bạn nên sử dụng 'patch'.

+0

+ ____________ 1 – Func

+0

Tôi đang cố sử dụng mã của bạn để vẽ hình khối xoay (không phải lưới). Bạn có quan tâm để giải thích tại sao 3 dòng cuối cùng là cách họ đang có? –

18

Hãy xem xét giải pháp được vector hóa này. Nó có advantage mà nó tạo ra một đối tượng đồ họa duy nhất:

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

bạn có thể làm cho các dòng loại bên trong suốt bằng cách thiết lập color = [0,65, 0,65, 0,65]. Và bạn có thể sử dụng kiểu đường gạch ngang cho các đường nội thất và các đường liền nét cho ranh giới để làm cho nó giống như một đối tượng 3-D.

Trong gói phần mềm của tôi, tôi mã một hàm mesh3 để vẽ các mắt lưới sản phẩm tensor 3-D.

0

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ể:

  1. Thay đổi tính minh bạch của khuôn mặt (FaceAlpha), và/hoặc,
  2. Thay đổi tính minh bạch của các cạnh (EdgeAlpha), và/hoặc,
  3. 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); 
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

Một số giải thích, ngoài mã, sẽ làm cho câu trả lời này hữu ích hơn. –

Các vấn đề liên quan