matlab使用教程(93)—流粒子动画和圆锥图

1.创建流粒子动画

1.1随时间变化的抛射体路径

此示例演示如何使用三维箭头图将抛射体路径显示为时间函数。

使用速度和加速度常量 vz 与 a 显示如下抛射体路径。计算时间从 0 到 1 的变化过程中高度 z 的值。

vz = 10; % velocity constant
a = -32; % acceleration constant         
t = 0:.1:1;
z = vz*t + 1/2*a*t.^2;

计算 x 方向和 y 方向上的位置。

vx = 2;
x = vx*t;

vy = 3;
y = vy*t;

计算速度向量的分量并使用三维箭头图显示该向量。将坐标区的视点改为 [70,18]

u = gradient(x);
v = gradient(y);
w = gradient(z);
scale = 0;

figure
quiver3(x,y,z,u,v,w,scale)
view([70,18])

Figure contains an axes object. The axes object contains an object of type quiver.

1.2粒子动画可以显示哪些信息

流粒子动画可用于可视化向量场的流向和速度。“粒子”(由线标记表示)用于跟踪沿特定流线的流动。动画中每个粒子的速度与流线上任何给定点处的向量场的模成正比。

1.3指定数据范围的起点

本示例通过指定适当的起点来确定要绘制的体区域。在本例中,流线图的起点为 x = 100,y 方向上的范围为 20 到 50,并位于 z = 5 的平面上,这并不是完整的体范围。

load wind
[sx sy sz] = meshgrid(100,20:2:50,5);

1.4创建流线以指示粒子路径

本示例使用流线(stream3streamline)跟踪动画粒子的路径,为动画添加视觉环境。

verts = stream3(x,y,z,u,v,w,sx,sy,sz);
sl = streamline(verts);

1.5定义视图

虽然所有流线都开始于 z = 5 的平面,但某些螺旋线的值更低。以下设置提供了清晰的动画视图:

  • 选择的视点 (view) 既能显示包含大部分流线的平面,又能显示螺旋线。

  • 将数据的纵横比 (daspect) 设为 [2 2 0.125] 可在 z 方向提供更高的分辨率,使螺旋线中的流粒子更容易看清。

  • 将坐标区范围设置为与数据范围匹配 (axis),然后绘制轴框 (box)。

    view(-10.5,18)
    daspect([2 2 0.125])
    axis tight;
    set(gca,'BoxStyle','full','Box','on')

1.6计算流粒子顶点

确定流线上要绘制粒子的顶点。interpstreamspeed 函数基于流线顶点和向量数据的速度返回此数据。本示例将速度缩放 0.05,以增加插值顶点的数量。

将坐标区的 SortMethod 属性设置为 childorder,使动画运行速度更快。

streamparticles 函数设置以下属性:

  • 将 Animate 设置为 10,使动画运行 10 次。

  • 将 ParticleAlignment 设置为 on,以便同时开始所有粒子跟踪。

  • 将 MarkerEdgeColor 设置为 none,以便只绘制圆形标记的面。如果不绘制标记的边,动画通常会运行得更快。

  • 将 MarkerFaceColor 设置为 red

  • 将 Marker 设置为 o,以绘制圆形标记。您也可以使用其他线标记。

    iverts = interpstreamspeed(x,y,z,u,v,w,verts,0.01);
    set(gca,'SortMethod','childorder');
    streamparticles(iverts,15,...
    	'Animate',10,...
    	'ParticleAlignment','on',...
    	'MarkerEdgeColor','none',...
    	'MarkerFaceColor','red',...
    	'Marker','o');

2.利用圆锥图显示向量场

2.1圆锥图可以显示哪些信息

本示例绘制 wind 数据的速度向量圆锥图。生成的圆锥图利用了好几种可视化方法:

  • 通过等值面为圆锥图提供视觉环境,并提供为一组圆锥体选择特定数据值的方法。

  • 通过光照使等值面的形状清晰可见。

  • 通过透视投影、相机定位和视角调整合成最终视图。

2.2创建等值面

在矩形数据空间显示等值面可为圆锥图提供视觉环境。创建等值面需要多个步骤:

  1. 计算代表风速的向量场的模。

  2. 使用 isosurface 和 patch 绘制等值面,以说明矩形空间中哪些位置的风速等于特定值。等值面内的区域风速较高,等值面外的区域风速较低。

  3. 使用 isonormals 根据体数据计算等值面的顶点法线,而不是根据用来渲染等值面的三角形来计算顶点法线。这样的法线通常可以生成更准确的结果。

  4. 设置等值面的视觉属性,使其为红色并且不绘制边(FaceColorEdgeColor)。

    load wind
    wind_speed = sqrt(u.^2 + v.^2 + w.^2);
    hiso = patch(isosurface(x,y,z,wind_speed,40));
    isonormals(x,y,z,wind_speed,hiso)
    hiso.FaceColor = 'red';
    hiso.EdgeColor = 'none';

2.3为等值面添加等值顶

等值顶与切片平面的相似之处在于它们都显示体的横截面。它们被设计成等值面的端顶。在等值顶上使用插补面颜色将导致数据值映射到当前颜色图中的颜色。要为等值面创建等值顶,请按相同的等值定义它们(isocapspatchcolormap)。

hcap = patch(isocaps(x,y,z,wind_speed,40),...
   'FaceColor','interp',...
   'EdgeColor','none');
colormap hsv

2.4创建第一组圆锥体

  • 在调用 coneplot 之前,请使用 daspect 设置坐标区的数据纵横比,以便函数确定圆锥体的正确大小。

  • 通过计算具有较小等值的另一个等值面来确定放置圆锥体的点(使圆锥体显示在第一个等值面之外),并使用 reducepatch 减少面和顶点的数量(使图中的圆锥体不会过多)。

  • 绘制圆锥体,并将面颜色设置为 blue,将边颜色设置为 none

    daspect([1 1 1]);
    [f,verts] = reducepatch(isosurface(x,y,z,wind_speed,30),0.07);
    h1 = coneplot(x,y,z,u,v,w,verts(:,1),verts(:,2),verts(:,3),3);
    h1.FaceColor = 'blue';
    h1.EdgeColor = 'none';

5.5创建第二组圆锥体

  1. 使用数据范围内的值创建第二组点(linspacemeshgrid)。

  2. 绘制第二组圆锥体,并将面颜色设置为 green,将边颜色设置为 none。

    xrange = linspace(min(x(:)),max(x(:)),10);
    yrange = linspace(min(y(:)),max(y(:)),10);
    zrange = 3:4:15;
    [cx,cy,cz] = meshgrid(xrange,yrange,zrange);
    h2 = coneplot(x,y,z,u,v,w,cx,cy,cz,2);
    h2.FaceColor = 'green';
    h2.EdgeColor = 'none';

2.6定义视图

  1. 使用 axis 命令将坐标轴范围设置为等于数据的最小值和最大值,并将图包含在框中以增强立体感 (box)。

  2. 将投影类型设置为透视,以生成更自然的体视图。设置视点并放大,以使场景变大(camprojcamzoomview)。

    axis tight
    set(gca,'BoxStyle','full','Box','on')
    camproj perspective
    camzoom(1.25)
    view(65,45)

2.7添加光照

添加光源并使用 Gouraud 光照,使等值面具有最平滑的光照效果。提高等值顶上的背景光强度,使等值顶更亮(camlightlightingAmbientStrength)。

camlight(-45,45)
hcap.AmbientStrength = 0.6;
lighting gouraud

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

配电网和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值