2014-09-09 4 views
2

У меня есть набор траекторий частиц в трехмерном пространстве, и я хочу представить их с использованием трехмерных линий тока. Я легко могу получить траекторию, используя plot3, и я могу представить вектор скорости с помощью колчана 3. В качестве примера, можно рассмотреть следующий пример сценарияСоздайте 3D streamtube (или упорядочить) по данным траектории частицы

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; 

, который производит следующий сюжет

plot3+quiver3

Я хочу иметь один и тот же сюжет, но с 3D streamtube заменой траектории линии. Каков наиболее эффективный способ справиться с этой ситуацией?

+0

Проверьте, если у вас есть 'streamtube' функции (может зависеть от Версия MATLAB) – nkjt

+0

У меня это есть, но проблема в том, что функция streamtube (или streamline) принимает в качестве входного сигнала только полное трехмерное векторное поле (то есть то, которое вы может получить из meshgrid). –

ответ

3

Обычно streamtube и streamline работает с векторными полями, в частности в 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)) 

это скрипты формирует набор из десяти траекторий, а затем построить линии тока с plot3, но и с streamtube. Однако streamtube выполняет точно такую ​​же работу, заменяя линию трубой. Если вы хотите, вы также можете установить ширину каждой трубки.

Существует также возможность перевести ваше неструктурированное векторное поле в структурированное, используя функцию griddata, однако результат в этом случае будет зависеть от того, как и на сколько траекторий. Я бы предпочел бы два предыдущих метода, третий можно было бы использовать, если у вас есть огромное количество траекторий, и вы хотите окутать их все в одну пробирку.
Пожалуйста, дайте мне знать, если это ответит на ваш вопрос.
Алессандро

4

Вы можете использовать возможность непосредственно вставить вершины в streamtube

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

Вот что вы получите

streamtube for turbulent

+1

Большое спасибо, ваш ответ краток и решает точно мою проблему. К сожалению, алексмогаверо уже ответил на вопрос, и его вопрос несколько более объяснительный, поэтому я проверю его ответ как правильный. Я хочу, чтобы был какой-то способ отметить оба ответа как правильно :( –

+0

@JuanSebastianTotero благодарит вас за щедрость! Рад, что я мог помочь. – Shai

+0

Спасибо @JuanSebastianTotero Я надеюсь, что мы вам помогли. – alexmogavero