我在一个三维空间里有一组粒子轨迹,我想用三维流线来表示它们。我可以用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;,这会产生以下情节

我想要同样的情节,但用三维流光管代替轨迹线。处理这种情况最有效的方法是什么?
发布于 2014-09-11 13:17:43
通常,streamtube和streamline工作在向量场上,特别是在MATLAB中,它们只适用于结构化网格(即由meshgrid生成的网格)。
你所拥有的是一个非结构化向量场,但是由于你有一组轨迹,你实际上已经计算了流线,实际上,轨迹就是流线(你把向量场定义为轨迹的导数)。
所以基本上你可以用“plot 3”来绘制流线。
如果我正确地理解了您的问题,那么解决方案如下:
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将非结构化向量场转换为结构化向量场,但是这种情况下的结果将取决于轨迹的大小和数量。我更喜欢前两种方法,第三种方法可以使用,如果你有大量的轨迹,你想把它们都包在一个单管里。
如果这回答你的问题,请告诉我。
阿莱桑德罗
发布于 2014-09-15 08:41:16
您可以使用该选项直接向streamtube插入顶点。
w = sqrt( px.^2 + py.^2 + pz.^2 );
hh = streamtube( { [xx; yy; zz]' }, {w'} );
set( hh, 'EdgeColor', 'none' );这是你得到的

https://stackoverflow.com/questions/25740685
复制相似问题