Matlab

2011-09-05 16 views
16

में 3 डी ग्रिड (घन) प्लॉट कैसे करें हाय मैं इसमें पारदर्शी घन-आकार के ग्रिड को लाइनों के साथ साजिश करना चाहता हूं। कुछ इस तरह:Matlab

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

मैं Matlab R2009b का उपयोग करें: enter image description here

हालांकि, मैं केवल एक 2 डी ग्रिड आकर्षित करने में कामयाब रहे। यदि मैटलैब में इसे साजिश करना असंभव है, तो क्या आप मुझे ऐसे सॉफ़्टवेयर की अनुशंसा कर सकते हैं जिसका मैं उपयोग कर सकता हूं।

+1

एक बहुत ही अजीब परिप्रेक्ष्य है:

यहाँ मामले में 'plotcube' कोड ओलिवर द्वारा मूल कोड के लिए लिंक किसी दिन टूट जाता है। वो क्या है? परिप्रेक्ष्य? सममितीय? कुछ और? – Rook

उत्तर

12

आप छोरों के लिए कुछ कोई आपत्ति नहीं है, कुछ इस तरह काम करेगा:

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 

तुम बस ग्रिड शायद लाइन गुणों को बदलने से पारदर्शी बनाने के लिए की आवश्यकता होगी, मैं तुम्हें नहीं लगता कि कर सकते हैं इसे पूरा करने के लिए अल्फा मान बदलें। उम्मीद है कि मददगार है।

+0

+1 यही वही था जो मैं चाहता था। – Func

8

स्टीफन जवाब का एक और अधिक vectorized संस्करण निम्न हो सकती है:

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

दुर्भाग्य से, MATLAB वर्तमान में पारदर्शी लाइनों (मेरी जानकारी के लिए) का समर्थन नहीं करता। यदि आपको वास्तव में पारदर्शी होने की आवश्यकता है तो मैं 'पैच' का उपयोग करने का सुझाव दूंगा।

+0

+ ____________ 1 – Func

+0

मैं घुमावदार घन (ग्रिड नहीं) खींचने के लिए अपने कोड का उपयोग करने की कोशिश कर रहा हूं। क्या आप यह बताने की परवाह करेंगे कि आखिरी 3 लाइनें किस तरह से हैं? –

18

इस वेक्टरकृत समाधान पर विचार करें। यह advantage है कि यह एक एकल ग्राफिक वस्तु बनाता है:

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

आप रंग की स्थापना = द्वारा पारदर्शी के अंदर लाइन तरह कर सकते हैं [0.65, 0.65, 0.65]। और आप 3-डी ऑब्जेक्ट की तरह इसे बनाने के लिए आंतरिक रेखाओं और सीमा के लिए ठोस रेखाओं के लिए डैश लाइन शैली का उपयोग कर सकते हैं।

मेरे सॉफ़्टवेयर पैकेज में, मैं 3-डी टेंसर उत्पाद मेस प्लॉट करने के लिए एक mesh3 फ़ंक्शन कोड करता हूं।

0

मुझे समझ में आता है कि यह देर से उत्तर है, लेकिन यह अभी भी वैध है अगर कोई और भी वही काम कर रहा है।

मान लिया जाये कि आप क्यूब्स (/ उनके किनारों), जवाब पहले ही उपलब्ध करा लिए एक विकल्प के ओलिवर से 'plotcube' कोड का उपयोग करने के लिए है योजना बना रहे हैं: plotcube

इस समाधान का लाभ आप कर सकते हैं वह यह है कि:

  1. बदलें चेहरे (FaceAlpha) की पारदर्शिता, और/या,
  2. बदलें किनारों (EdgeAlpha) की पारदर्शिता, और/या,
  3. बदलें रेखाओं का रंग (एज रंग)।

ये सभी स्थिरांक या चर हो सकते हैं। (उदा। फिक्स्ड एज रंग, या जेड-वैल्यू इत्यादि के साथ बदलते रंग)

2. और 3. (ऊपर) की कार्यक्षमता में जोड़ने के लिए 'सेलफन (@ पैच ...अधिक जानकारी के लिए

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

:;: 'Olivers कोड में अनुभाग, इस प्रकार कोड के चार अतिरिक्त लाइनों में जोड़ने (नई सहित इस के साथ पूरे cellfun वर्ग को प्रतिस्थापित' EdgeAlpha 'और' EdgeColor 'लाइनों) 'पैच' कृपया patch दस्तावेज देखें।

एक महत्वपूर्ण नोट: - बड़े मॉडल (कई क्यूब्स) के लिए यह बहुत धीमा है। उदा। हजारों ब्लॉक पर MATLAB में 'for' लूप में 'plotcube' फ़ंक्शन चला रहा है। मेरा मानना ​​है कि यह 'पैच' फ़ंक्शन को कई बार कॉल करने से है। वेक्टरिस के लिए एक बेहतर समाधान होगा; अपने सभी बिंदुओं (शीर्षकों/चेहरे/जो भी) को एक ही मैट्रिक्स में पहले एक साथ रखने के लिए और फिर केवल एक बार @ पैच फ़ंक्शन को कॉल करें ('लूप के लिए' नहीं)। इसके लिए सभी 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); 
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

कुछ स्पष्टीकरण, कोड के अतिरिक्त, यह उत्तर अधिक उपयोगी होगा। –