首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从粒子轨迹数据创建三维流光管(或流线型)

从粒子轨迹数据创建三维流光管(或流线型)
EN

Stack Overflow用户
提问于 2014-09-09 09:07:56
回答 2查看 1.7K关注 0票数 2

我在一个三维空间里有一组粒子轨迹,我想用三维流线来表示它们。我可以用plot3很容易地得到轨迹,也可以用quiver3来表示速度矢量。作为一个示例,可以考虑以下示例脚本

代码语言:javascript
运行
复制
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;

,这会产生以下情节

我想要同样的情节,但用三维流光管代替轨迹线。处理这种情况最有效的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-11 13:17:43

通常,streamtubestreamline工作在向量场上,特别是在MATLAB中,它们只适用于结构化网格(即由meshgrid生成的网格)。

你所拥有的是一个非结构化向量场,但是由于你有一组轨迹,你实际上已经计算了流线,实际上,轨迹就是流线(你把向量场定义为轨迹的导数)。

所以基本上你可以用“plot 3”来绘制流线。

如果我正确地理解了您的问题,那么解决方案如下:

代码语言:javascript
运行
复制
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将非结构化向量场转换为结构化向量场,但是这种情况下的结果将取决于轨迹的大小和数量。我更喜欢前两种方法,第三种方法可以使用,如果你有大量的轨迹,你想把它们都包在一个单管里。

如果这回答你的问题,请告诉我。

阿莱桑德罗

票数 3
EN

Stack Overflow用户

发布于 2014-09-15 08:41:16

您可以使用该选项直接向streamtube插入顶点。

代码语言:javascript
运行
复制
w = sqrt( px.^2 + py.^2 + pz.^2 );
hh = streamtube( { [xx; yy; zz]' }, {w'} );
set( hh, 'EdgeColor', 'none' );

这是你得到的

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25740685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档