2014-09-09 2 views
2

3D 공간에서 입자 궤도 집합이 있으며 3D 유선을 사용하여이를 표현하고 싶습니다. plot3을 사용하여 쉽게 궤적을 얻을 수 있으며, quiver3을 사용하여 속도 벡터를 나타낼 수 있습니다. 예를 들어, 하나는입자 궤도 데이터로 3D streamtube (또는 유선형) 만들기

plot3+quiver3

내가 같은 플롯을 갖고 싶어 다음 플롯을 생성하는 다음 예제 스크립트

zz = 0:pi/50:10*pi; 
yy = zz.*sin(zz); 
xx = zz.*cos(zz); 
px=[0,diff(xx)]; 
py=[0,diff(yy)]; 
pz=[0,diff(zz)]; 

plot3(xx,yy,zz); 
hold all; 
quiver3(xx(1:5:end),yy(1:5:end),zz(1:5:end),px(1:5:end),py(1:5:end),pz(1:5:end),3); 
hold off; 

을 고려할 수 있지만, 3D streamtube와 궤적 라인 교체. 이 상황을 처리하는 가장 효율적인 방법은 무엇입니까?

+0

확인을 무엇을 얻을 MATLAB 버전) – nkjt

+0

내가 가지고 있지만, 문제는 streamtube (또는 유선형) 함수가 입력으로 전체 3D 벡터 필드 만 허용한다는 것입니다 (즉, meshgrid에서 얻을 수 있음). –

답변

3

보통 streamtubestreamline은 벡터 필드에서 작동합니다. 특히 MATLAB에서는 구조화 된 메쉬 (즉, meshgrid에서 생성 된 것)에서만 작동합니다.
구조화되지 않은 벡터 필드가 있지만, 이미 실제로 유선형이 계산 된 궤도 집합이 있으므로 실제 궤도는 유선형입니다 (벡터 필드를 궤도의 파생물로 정의).
기본적으로`plot3 '을 사용하여 유선형을 그릴 수 있습니다.

clear all 
close all 

x = []; 
y = []; 
z = []; 
Px = []; 
Py = []; 
Pz = []; 

figure(1) 
for i=1:10 
    a= rand; 
    b= rand; 
    zz{i} = 0:pi/50:10*pi; 
    yy{i} = a*zz{i}.*sin(zz{i}); 
    xx{i} = b*zz{i}.*cos(zz{i}); 
    px{i}=[0,diff(xx{i})]; 
    py{i}=[0,diff(yy{i})]; 
    pz{i}=[0,diff(zz{i})]; 


    plot3(xx{i},yy{i},zz{i}); 
    hold all; 

    XYZ{i} = [xx{i}',yy{i}',zz{i}']; 

    x = [x, xx{i}]; 
    y = [y, yy{i}]; 
    z = [z, zz{i}]; 
    Px = [Px, px{i}]; 
    Py = [Py, py{i}]; 
    Pz = [Pz, pz{i}]; 
end 
figure(2) 
streamtube(XYZ) 

[X,Y,Z] = meshgrid(linspace(min(x),max(x),10),linspace(min(y),max(y),10),linspace(min(z),max(z),10)); 
PX = griddata(x,y,z,Px,X,Y,Z); 
PX(isnan(PX)) = 0; 
PY = griddata(x,y,z,Py,X,Y,Z); 
PY(isnan(PY)) = 0; 
PZ = griddata(x,y,z,Pz,X,Y,Z); 
PZ(isnan(PZ)) = 0; 

figure(3) 
streamtube(X,Y,Z,PX,PY,PZ,zeros(1,10),zeros(1,10),linspace(min(z),max(z),10)) 

이 스크립트 10 개 궤도의 집합을 생성하고 또한 streamtubeplot3와 유선 줄거리 : 내가 제대로 문제를 이해하면
그런 다음 솔루션은 다음과 같다. 그러나 streamtube는 관을 가진 선을 대체하는 정확하게 동일한 일을 정확하게한다. 원하는 경우 각 튜브의 너비를 설정할 수도 있습니다.

griddata 함수를 사용하여 비정형 벡터 필드를 구조화 된 벡터 필드로 변환 할 수도 있습니다. 그러나이 경우 결과는 궤도의 방법과 개수에 따라 달라집니다. 전 두 가지 방법을 선호합니다. 거대한 양의 궤적을 갖고 있고 모든 것을 단일 튜브에 넣고 싶다면 세 번째 방법을 사용할 수 있습니다.
이 답변을 귀하의 질문에 알려주십시오.
알레산드로

당신은 바로 여기에 streamtube

w = sqrt(px.^2 + py.^2 + pz.^2); 
hh = streamtube({ [xx; yy; zz]' }, {w'}); 
set(hh, 'EdgeColor', 'none'); 

에 정점을 삽입하는 옵션을 사용할 수 있습니다

4

당신에 의존 수 (은`streamtube` 기능이 경우

streamtube for turbulent

+1

대단히 감사합니다. 귀하의 답변은 간결하며 정확하게 제 문제를 해결해줍니다. 슬프게도, alexmogavero는 이미 질문에 대답했으며, 그의 질문은 좀 더 설명 적이기 때문에 그의 대답이 올바른지 점검 할 것입니다. 두 답변을 올바르게 표시 할 수있는 방법이 있었으면합니다. ( –

+0

@JuanSebastianTotero 감사합니다. 기꺼이 도와 드리겠습니다. – Shai

+0

감사합니다. @JuanSebastianTotero – alexmogavero

관련 문제