matlab

2011-08-21 21 views
6

में 3 डी लाइनों का एक गुच्छा खींचने का सबसे प्रभावी तरीका मुझे मैटलैब में 3 डी लाइनों की एक सूची प्लॉट करने की आवश्यकता है। ऐसा करने का सबसे तेज़ तरीका क्या है? मैं वर्तमान की तरहmatlab

%edges is a MX2 matrix, holding the list of edges 
%points are the vertices' coordinates 
hold on; %so all the lines will be saved 
for i=1:size(edges,1) 
    a=edges(i,1); %get first point's index 
    b=edges(i,2); %get second point's index 
    p=[points(:,a) points(:,b)]; %construct a 3X2 matrix out of the 2 points 
    plot3(p(1,:),p(2,:),p(3,:)); %plot a line 
end 

कुछ कर रहा हूँ लेकिन यह केवल वास्तविक पाश के दौरान धीमी गति से, लेकिन यह भी अंत में, जिसके परिणामस्वरूप साजिश बहुत धीमी गति से और लापरवाह है जब मैं उदाहरण के लिए, करने की कोशिश है, का उपयोग कर इसे बारी बारी से खींचें & घुमाने उपकरण।

मैं एक ही भूखंड ओपन आदि का उपयोग बहुत तेजी से चल पाएंगे ...

उत्तर

1

मुझे लगता है कि आप इस तरह से कुछ कर सकते हैं पता है (सावधानी - मस्तिष्क संकलित कोड ...)

figure; 
patch('faces', edges, 'vertices', points, 'edgecolor', 'b'); 
axis equal; 

कहाँ edges सूचकांक के Nx2 मैट्रिक्स होना चाहिए और points समन्वय के Mx3 मैट्रिक्स होना चाहिए (आपके points सरणी का स्थानांतरण) होना चाहिए।

मेरे अनुभव से, patch पर कॉल करने से plot पर बार-बार कॉल की तुलना में काफी तेज हो सकता है।

कुछ विचार दे करने के लिए, बार 1000 यादृच्छिक रूप से जनरेट रेखा खंड उत्पन्न करने के लिए, मेरे का उपयोग कर MATLAB 7.1 इस प्रकार हैं (वैसे वर्ष!):

  1. patch कॉलिंग: 0.03 सेकंड।
  2. कॉलिंग plot: 0.5 सेकंड।

संपादित:

यह काम करता है के आसपास मुद्दा किनारे कि: एक तरीके के रूप में आप चाहते हैं (धार प्रति एक ही रंग को निर्दिष्ट) बढ़त रंग व्यवहार प्राप्त करने के लिए इस प्रकार डुप्लिकेट कोने से परिचित कराना है रंग केवल वर्टेक्स रंग डेटा के माध्यम से अप्रत्यक्ष रूप से निर्दिष्ट किया जा सकता है। अगर हम केवल कशेरुक रंगों पर भरोसा करते थे तो एक सामान्य कशेरुक साझा करने वाले सभी किनारों को उस कशेरुक को दिए गए रंग के साथ समाप्त हो सकता है - 'फ्लैट' किनारे रंग विवरण here देखें।

%% a "star" shape, so that we can really see what's going on 
%% with the edge colours!! 
pp = [0,0,0; 1,-1,0; 1,1,0; -1,1,0; -1,-1,0]; 
ee = [1,2; 1,3; 1,4; 1,5]; 

%% important - only 1 colour known per edge, not per vertex!! 
cc = (1:size(ee,1))'; 

%% setup a new set of vertices/edges/colours with duplicate vertices 
%% so that each edge gets it's correct colour 
nnum = 0; 
pnew = zeros(2 * size(ee, 1), 3); %% new vertices 
enew = zeros(1 * size(ee, 1), 2); %% new edge indices 
cnew = zeros(2 * size(ee, 1), 1); %% new edge colours - via vertices 
for j = 1 : size(ee, 1) 
    n1 = ee(j, 1); %% old edge indices 
    n2 = ee(j, 2); 
    enew(j, 1) = nnum + 1; %% new edge indicies into pnew 
    enew(j, 2) = nnum + 2; 
    pnew(nnum + 1, :) = pp(n1, :); %% create duplicate vertices 
    pnew(nnum + 2, :) = pp(n2, :); 
    cnew(nnum + 1) = cc(j); %% map single edge colour onto both vertices 
    cnew(nnum + 2) = cc(j); 
    nnum = nnum + 2; 
end 

%% Draw the set efficiently via patch 
tic 
figure; 
hold on; 
patch('faces', enew, 'vertices', pnew, 'facevertexcdata', cnew, ... 
    'edgecolor', 'flat', 'facecolor', 'none'); 
plot(pnew(:,1), pnew(:,2), 'b.'); 
axis equal; 
toc 

अगर MATLAB आप सीधे बढ़त रंग डेटा निर्दिष्ट करने के लिए अनुमति दी यह अच्छे हो सकता है - लेकिन यह है कि ...

आशा इस मदद करता है समर्थन करने के लिए प्रतीत नहीं होता।

+0

धन्यवाद! क्या कोई मौका है कि आप मुझे यह भी दिखा सकते हैं कि मैं रंगों की एक सरणी कैसे भेज सकता हूं ताकि प्रत्येक किनारे को एक अलग रंग के साथ रंग दिया जा सके? – olamundo

+0

@noam: आप जो चाहते हैं उसके आधार पर कुछ अलग रंग विकल्प हैं। आप कोष्ठक से इंटरपोलेटेड रंग सेट करने के लिए 'facevertexcdata' पैरामीटर का उपयोग कर सकते हैं - इन पंक्तियों के साथ एक विचार प्राप्त करने के लिए 'trimesh संपादित करें' टाइप करें। यदि आप बस कुछ फ्लैट रंग (''बी', 'के', 'आर', आदि 'चाहते थे) मुझे लगता है कि आप किनारों को कुछ अलग समूहों में तोड़ सकते हैं और प्रत्येक समूह के लिए एक रंग चुन सकते हैं - मुझे लगता है यहां आपके रंगों की तुलना में कई और किनार हैं। अन्य विकल्प हो सकते हैं - दस्तावेज़ीकरण की जांच करें ... –

+0

मुझे वास्तव में कई रंगों में से प्रत्येक किनारे को एक अलग रंग के साथ रंगना होगा (कहें कि मैं कुछ संरचना के सभी समर्थन बीम पर लगाए गए तनाव को प्रदर्शित कर रहा हूं)। इसलिए मुझे किनारे से रंग निर्दिष्ट करना है, कशेरुक द्वारा नहीं, और मैं कई अलग-अलग समूहों में किनारों को तोड़ नहीं सकता क्योंकि बहुत सारे रंग हैं ... – olamundo

6

आप अलग-अलग क्षेत्रों के रूप में प्लॉट करने के लिए NaN का उपयोग कर LINE निम्न स्तर के समारोह का उपयोग कर सकते:

%# sample graph vertices and edges (similar to your data) 
[adj,XYZ] = bucky; 
[r c] = find(adj); 
edges = [r c];  %# M-by-2 matrix holding the vertex indices 
points = XYZ';  %# 3-by-N matrix of points X/Y/Z coordinates 

%# build a list of separated lines 
e = edges'; 
e(end+1,:) = 1; 
e = e(:); 
p = points(:,e); 
p(:,3:3:end) = NaN; 

figure 
h = line(p(1,:), p(2,:), p(3,:)); 
view(3) 

यह बहुत ही कुशल है, क्योंकि यह एक पंक्ति वस्तु बनाता है।अब आप लाइन अनुकूलित कर सकते हैं, लेकिन यह पूरी बात के लिए एक रंग है के लिए प्रतिबंधित है:

set(h, 'Color',[.4 .4 1], 'Marker','.', 'MarkerSize',10, ... 
    'MarkerFaceColor','g', 'MarkerEdgeColor','g') 

line


टिप्पणियों के अनुसार, अगर आप अपने ग्राफ में प्रत्येक बढ़त हासिल है करना चाहते हैं एक निर्दिष्ट रंग में, इसके बजाय निम्नलिखित कोड पर विचार करें। यह का इस्तेमाल किया जाता SURFACE समारोह:

p = p';      %'# transpose the above p for convenience 
clr = (1:size(p,1))';  %'# for each edge, color index in current colormap 
figure 
surface(p(:,[1 1]), p(:,[2 2]), p(:,[3 3]), [clr clr], ... 
    'EdgeColor','flat', 'FaceColor','none') 
colormap(hsv(numel(clr))) %# specify your colormap here 
view(3) 

surface

+0

'सतह' समाधान पूछा गया है कि निकटतम है, लेकिन यदि आप http://www.mathworks.com/help/techdoc/ref/surface_props.html की जांच करते हैं, तो ऐसा लगता है कि 'एजकॉल्टर' केवल अप्रत्यक्ष रूप से सेट है कशेरुका रंग डेटा (यह दर्शाता है कि प्रति किनारे सभी किनारों को सबसे कम संख्या वाले वर्टेक्स का रंग साझा किया जाता है), प्रत्येक किनारे के लिए रंग निर्दिष्ट करने के बजाय - जो वांछित है। त्वरित जांच के आधार पर, ऐसा लगता है कि 'पैच' समाधान के समान व्यवहार होता है। शायद मुझे कुछ याद आया ?? –