2011-09-05 65 views
16

Hola me gustaría trazar una cuadrícula transparente en forma de cubo con líneas en ella. Algo como esto: enter image description hereCómo trazar la cuadrícula 3D (cubo) en Matlab

Sin embargo, sólo logró dibujar una cuadrícula 2D:

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

uso de Matlab R2009b. Si no es posible trazar esto en matlab, ¿podría recomendarme un software que pueda usar?

+1

Esa es una perspectiva muy raro. ¿Que es eso? ¿Perspectiva? Isométrico? ¿Algo más? – Rook

Respuesta

12

Si no te importa unas cuantas para bucles, algo como esto funcionará:

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 

Usted sólo tendrá que hacer la rejilla transparente, probablemente, el cambio de propiedades de la línea, yo no te puedo pensar cambie los valores alfa para lograr esto. Espero que sea útil.

+0

+1 Eso es lo que quería. – Func

8

Una versión más vectorizada de la respuesta de Stephen podría ser el siguiente:

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

Desafortunadamente, MATLAB no soporta actualmente líneas transparentes (que yo sepa). Si realmente necesitas que sean transparentes, te sugiero usar 'parche'.

+0

+ ____________ 1 – Func

+0

Estoy tratando de usar tu código para dibujar un cubo girado (no la cuadrícula). ¿Te importaría explicar por qué las 3 últimas líneas son como son? –

18

Considere esta solución vectorizada. Tiene la advantage que crea un único objeto gráfico:

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

que puede hacer el tipo de línea interior de transparencia mediante el establecimiento color = [0,65, 0,65, 0,65]. Y puede usar el estilo de línea de trazos para las líneas interiores y las líneas continuas para los límites para que se parezca más a un objeto tridimensional.

En mi paquete de software, codigo una función mesh3 para graficar las mallas del producto tensor 3-D.

0

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:

  1. cambiar la transparencia de las caras (FaceAlpha), y/o,
  2. cambiar la transparencia de los bordes (EdgeAlpha), y/o,
  3. 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); 
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

Algunas explicaciones, además del código, harían que esta respuesta sea más útil. –

Cuestiones relacionadas