2011-08-21 84 views
6

我需要繪製matlab中的三維線列表。什麼是最快捷的方法呢? 我目前做這樣的事情在matlab中繪製一堆3d線的最有效方法

%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 

但是,這是實際的循環過程中不慢而已,但也到了最後,所產生的情節是非常緩慢的,irresponsive當我嘗試,例如,使用旋轉它拖動&旋轉工具。

我知道使用的OpenGL等將運行得更快同積...

回答

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''參數來設置頂點的內插顏色 - 輸入'edit trimesh'來獲得這些線條的想法。如果你只是想要一些平的顏色(''b','k','r'等'),我想你可以把邊緣分成幾個不同的組,併爲每個組選擇一種顏色 - 我假設在這裏,你有更多的邊緣比顏色。可能還有其他的選擇 - 檢查文檔... –

+0

我實際上需要用不同的顏色爲每個邊緣着色,用很多顏色(比如說我顯示施加在某些結構的所有支撐樑上的應力)。所以我需要指定顏色的邊緣,而不是頂點,我不能把邊緣分成幾個不同的組,因爲顏色很多...... – olamundo

6

可以使用LINE低級別的功能,使用NaN繪製作爲單獨的段:

%# 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,它似乎再次似乎'edgecolor'僅通過間接設置頂點顏色數據(它意味着每個面的所有邊都共享最低編號頂點的顏色),而不是直接爲每個邊指定顏色 - 這就是我們想要的。基於快速檢查,這似乎與「補丁」解決方案具有相同的行爲。也許我錯過了什麼? –