2011-08-21 20 views
6

私は、MATLABに3dラインのリストをプロットする必要があります。それを行う最も簡単な方法は何ですか? 私は現在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; 

edgesNx2のインデックスのマトリックスで、pointsMx3の座標のマトリックス(pointsの配列の転置)である必要があります。

私の経験から、patchを直接呼び出すことは、plotを繰り返し呼び出すよりも大幅に高速になる可能性があります。私の使用して、1000個の、ランダムに生成されたラインセグメントを生成するために、時間をいくつかのアイデアを与えることを

次のようにMATLAB 7.1は、(確かに古い!):

  1. patchを呼び出す:0.03秒。
  2. plotを呼び出して0.5秒。

EDIT:あなたは(エッジごとに1色を指定する)したいとエッジの色振る舞いを取得する1つの方法は、次のように重複した頂点を導入することである。

この作品、周りの問題エッジいること色は頂点カラーデータを介してのみ間接的に指定することができます。頂点の色のみに依存する場合、共通の頂点を共有するすべての辺が、その頂点に割り当てられた色で終わる可能性があります。「平坦な」エッジカラーの説明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

ありがとう:それはSURFACE機能を使用することを含みます!それぞれのエッジが異なる色で色付けされるように、どのように色の配列を送ることができますか? – olamundo

+0

@noam:あなたが何を望むかによって、いくつかの色付けオプションがあります。 ''facevertexcdata''パラメータを使って頂点から補間された色を設定することができます。これらの線に沿ってアイデアを得るには' edit trimesh'をタイプします。いくつかのフラットな色( '' b '、' k '、' r '、etc')をほしいと思ったら、いくつかの異なるグループにエッジを壊して、それぞれのグループに対して単一の色を選ぶことができると思います。ここであなたは色よりも多くのエッジを持っています。他のオプションがあるかもしれません - ドキュメントを確認してください... –

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

それは単一ラインオブジェクトを作成し、これは非常に効率的です。今、あなたはラインをカスタマイズすることができますが、全体の事のための1つのカラー持つように制限されている:あなたは、グラフ内の各エッジを持つようにしたい場合は、コメントによると

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

line


を指定された色で、代わりに次のコードを検討してください。

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

'surface'の解決策は尋ねられたものに最も近いものですが、http://www.mathworks.com/help/techdoc/ref/surface_props.htmlをチェックすると、再び' edgecolor'が間接的にしか設定されていないようです各辺の色を直接指定するのではなく、頂点の色データ(これは面ごとのすべての辺が最小の番号の頂点の色を共有することを意味します)が必要です。クイックチェックに基づいて、これは 'patch'ソリューションと同じ振る舞いをするようです。たぶん私は何かを逃した?? –

関連する問題