2011-08-21 2 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 

뭔가를하고있는 중이 야하지만이뿐만 아니라 느린 실제 루프 동안,하지만 예를 들어, 시도 때도 마지막에 결과 플롯은 매우 느리고 응답 불가입니다 드래그 & 회전 도구.

나는 당신이 이런 식으로 뭔가 할 수 있다고 생각 같은 훨씬 빠르게 실행됩니다 OpenGL을 등을 사용하여 플롯 ...

답변

1

알고있다 (주의 - 뇌 컴파일 된 코드를 ...)

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

edges 인덱스의 Nx2 행렬이어야하며 pointsMx3 좌표 행렬 (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 ', 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) 

이 매우 효율적이다는 단 한 줄의 객체를 생성한다.이제 라인을 사용자 정의 할 수 있지만 전체 일에 대한 하나 개의 색상이 제한됩니다 : 당신이 당신의 그래프에서 각각 우위를 갖고 싶어, 의견에 따르면

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

'surface' 해결책은 물어 본 것과 가장 비슷하지만 http://www.mathworks.com/help/techdoc/ref/surface_props.html을 확인하면 다시'edgecolor'가 각 에지에 직접 색상을 지정하지 않고 정점 색상 데이터 (얼굴 당 모든 가장자리가 가장 낮은 번호의 정점의 색상을 공유 함을 의미 함) 빠른 점검을 토대로, 이것은'patch' 해결책과 같은 행동을하는 것으로 보입니다. 어쩌면 나는 무언가를 놓쳤다 ?? –

관련 문제