流体中的流线【StreamLines】的实现

news2024/11/10 17:04:55

流线是一条线,它是 与瞬时速度方向相切(速度是一个矢量,并且 它有一个大小和一个方向)。为了在流程中可视化这一点,我们 可以想象一个小的标记流体元素的运动。例如,我们可以标记一个 用荧光染料滴水,然后用激光照射它,这样 它会发出荧光。如果我们在液滴移动时拍摄一张短曝光照片 根据局部速度场(与 速度发生明显变化所需的时间),我们会看到一个短的条纹,带有 长度 V\Delta t,且方向与瞬时速度方向相切。如果我们 以这种方式标记许多水滴,其中的流线 流量将变得可见。由于流动中任何一点的速度都有一个值 (流动不能同时流向多个方向),流线不能 渡。除了在速度 量级为零,例如在停留带。

还有其他方法可以使流可见。例如,我们可以追踪出路径 然后是我们的荧光滴剂,使用长时间曝光的照片。这条线被称为路径线,它类似于您在拍摄长时间曝光照片时看到的 夜间高速公路上的车灯。路径线有可能交叉,就像你可以的那样 想象一下高速公路的类比:当一辆汽车改变车道时,它的路径线由它划出 灯光可能会穿过相邻车辆在另一处追踪出的另一条路径线 时间。

可视化流动模式的另一种方法是通过条纹线。条纹线是 由在某个较早的某个点通过特定点的所有粒子所追踪的线 时间。例如,如果我们从一个固定点连续发射荧光染料,则染料 当它顺流而下时构成一条条纹线。为了继续高速公路的类比,它是 线路由经过同一收费站的所有车辆上的信号灯组成。 如果它们都遵循相同的路径(稳定的流动),则会产生一条线,但如果它们遵循 不同的路径(不稳定流动),线路可能会自行交叉。

在 非定常流、流线、路径线和条纹线都是不同的,但在稳态流中,流线、流线、路径线 和条纹线是相同的。

一,manim中流线的创建。

1.流线函数 

StreamLines(func, color=None, color_scheme=None, min_color_scheme_value=0,
 max_color_scheme_value=2, colors=[ManimColor('#236B8E'), ManimColor('#83C167'),
 ManimColor('#FFFF00'), ManimColor('#FC6255')], x_range=None, y_range=None,
 z_range=None, three_dimensions=False, noise_factor=None, n_repeats=1, dt=0.05, 
virtual_time=3, max_anchors_per_line=100, padding=3, stroke_width=1,
 opacity=1, **kwargs)

 

参数解释

  1. func:

    • 说明: 定义的向量场函数,应该接受并返回坐标。这是流线的核心,控制流线的形状和运动。
    • 示例:
      def func(x, y): 
          return np.array([-y, x, 0]) # 旋转流线的向量场 
  2. color:

    • 说明: 流线的基本颜色。如果未指定,则可能使用颜色列表中的颜色或默认颜色。
    • 示例:
      color=WHITE # 设置流线的颜色为白色 
  3. color_scheme:

    • 说明: 定义流线颜色的方案,通常基于向量场的值。常用的方案包括“viridis”,“plasma”等。
    • 示例:
      color_scheme='viridis' # 使用预定义的颜色方案 
  4. min_color_scheme_value:

    • 说明: 颜色方案的最小值,控制颜色映射的起点。
    • 示例:
      min_color_scheme_value=0 # 最小的颜色值 
  5. max_color_scheme_value:

    • 说明: 颜色方案的最大值,控制颜色映射的终点。
    • 示例:
      max_color_scheme_value=2 # 最大的颜色值 
  6. colors:

    • 说明: 用于流线的颜色列表,允许用户定义具体使用的颜色。
    • 示例:
      colors=[ManimColor('#236B8E'), ManimColor('#83C167'),
       ManimColor('#FFFF00'), 
      ManimColor('#FC6255')] 
  7. x_range:

    • 说明: 流线绘制的 x 轴范围,用于限制绘制区域。
    • 示例:
      x_range=[-3, 3] # x 轴范围从 -3 到 3 
  8. y_range:

    • 说明: 流线绘制的 y 轴范围。
    • 示例:
      y_range=[-3, 3] # y 轴范围从 -3 到 3 
  9. z_range:

    • 说明: 当 three_dimensions=True 时,限制 z 轴的范围。
    • 示例:
      z_range=[-1, 1] # z 轴范围从 -1 到 1 
  10. three_dimensions:

    • 说明: 布尔值,指示流线是否在三维空间中绘制。
    • 示例:
      three_dimensions=True # 在三维空间中绘制流线 
  11. noise_factor:

    • 说明: 引入随机性以模拟更自然的流动模式。可以帮助增强真实感。
    • 示例:
      noise_factor=0.1 # 添加少量噪声 
  12. n_repeats:

    • 说明: 指定起始点的重复次数,影响流线的密集程度。
    • 示例:
      n_repeats=5 # 重复起始点5次 
  13. dt:

    • 说明: 模拟的时间步长,较小的值意味着更多的模拟步骤和较平滑的结果。
    • 示例:
      dt=0.05 # 设置时间步长为0.05 
  14. virtual_time:

    • 说明: 指定模拟应该运行的虚拟时间单位,控制动画的持续时间。
    • 示例:
      virtual_time=3 # 设置虚拟时间为3单位 
  15. max_anchors_per_line:

    • 说明: 设置构成单条流线的最大锚点数量,影响流线的复杂程度。
    • 示例:
      max_anchors_per_line=100 # 每条流线最多100个锚点 
  16. padding:

    • 说明: 向量场周围的间距,有助于可视化以防止流线过于靠近边缘。
    • 示例:
      padding=3 # 设置3个单位的间距 
  17. stroke_width:

    • 说明: 控制流线的宽度,允许用户自定义外观。
    • 示例:
      stroke_width=2 # 流线的宽度为2个单位 
  18. opacity:

    • 说明: 控制流线的透明度,通过调节来实现层叠效果。
    • 示例:
      opacity=0.8 # 设置透明度为80% 
  19. kwargs:

    • 说明: 允许传递附加参数,这些参数可能是特定于某个实现的或提供额外的自定义选项。
    • 示例:
      additional_param='some_value' # 任意附加参数 

示例代码

以下是使用 StreamLines 的代码示例,包含所有参数:

from manim import *  

class StreamLinesExample(Scene):  
    def construct(self):  
        # 定义向量场函数  
        # pos 是一个包含 x 和 y 的位置向量  
        # 这个函数会计算出一个二次元矢量,用于指定在该位置的流线方向和强度  
        # np.sin(pos[0]) * UR: 基于 x 坐标生成一个朝向右上方的分量  
        # np.cos(pos[1]) * LEFT: 基于 y 坐标生成一个朝向左的分量  
        # pos / 5: 将位置归一化,使得位置对流动的影响比较小  
        func = lambda pos: np.sin(pos[0]) * UR + np.cos(pos[1]) * LEFT + pos / 5  

        # 创建流线对象  
        streamlines = StreamLines(  
            func,  # 向量场函数  
            color=RED,  # 流线的颜色  
            color_scheme='viridis',  # 颜色方案用来色彩的过渡  
            min_color_scheme_value=0,  # 颜色方案的最小值  
            max_color_scheme_value=2,  # 颜色方案的最大值  
            colors="#ece6e2",  # 流线的基础颜色  
            x_range=[-3, 3],  # x轴范围  
            y_range=[-3, 3],  # y轴范围  
            z_range=[-1, 1],  # z轴范围(在三维情况下)  
            three_dimensions=True,  # 是否使用三维  
            noise_factor=0.1,  # 噪声因子,影响流线的随机性  
            n_repeats=5,  # 每个点生成的流线数  
            dt=0.05,  # 时间步长,用于模拟流动  
            virtual_time=3,  # 虚拟时间,用来控制流线的显示时长  
            max_anchors_per_line=100,  # 每条流线的最大锚点数量  
            padding=3,  # 流线的填充  
            stroke_width=2,  # 流线的宽度  
            opacity=0.8  # 流线的不透明度  
        )  
        
        # 将流线添加到场景中  
        self.add(streamlines)  
        # 使用 Create 动画来呈现流线效果  
        self.play(Create(streamlines), run_time=3)

 示例2:

class BasicUsage(Scene):
    def construct(self):
        func = lambda pos: ((pos[0] * UR + pos[1] * LEFT) - pos) / 3
        a=(StreamLines(func))
        self.play(a.create())

示例3: 

from manim import *

class SpawningAndFlowingArea(Scene):
    def construct(self):
        func = lambda pos: np.sin(pos[0]) * UR + np.cos(pos[1]) * LEFT + pos / 5
        stream_lines = StreamLines(
            func, x_range=[-3, 3, 0.2], y_range=[-2, 2, 0.2], padding=1
        )

        spawning_area = Rectangle(width=6, height=4)
        flowing_area = Rectangle(width=8, height=6)
        labels = [Tex("Spawning Area"), Tex("Flowing Area").shift(DOWN * 2.5)]
        for lbl in labels:
            lbl.add_background_rectangle(opacity=0.6, buff=0.05)

        self.add(stream_lines, spawning_area, flowing_area, *labels)

二, 函数方法:

1.crrate函数

create(lag_ratio=None, run_time=None, **kwargs)

该函数用于创建动画,使得对象在场景中展示出来。

参数说明:
  • lag_ratio: 控制动画执行的延迟程度。值在 [0, 1] 之间。较大的值会使得效果看起来更有延迟感,例如可以给每个对象增加一个延迟效果。
    • 示例lag_ratio=0.5 设置对象动画的延迟为 50%。
  • run_time: 动画运行的时间(以秒为单位)。可以用来控制动画的速度。
    • 示例run_time=2 设置动画运行时间为 2 秒。
  • **kwargs: 其他关键字参数,通常用于设置动画的具体行为或效果。例如,可以调用其他动画的额外参数,如 stroke_color 来改变线条颜色。

示例:

self.play(Create(circle, lag_ratio=0.1, run_time=2)) 

这个示例创建一个圆的动画,在 2 秒内完成,并且对象间有 0.1 的延迟效果。


 2.end_animation函数

end_animation()

 end_animation 是在动画中用于结束或停止动画的方法。具体的使用和效果可能因具体的动画库或框架而异。不过,通常情况下,这个方法会用来清理动画状态、结束当前动画的运行,并可能退回到初始状态或切换到某个结束状态。

以下是一般性说明:

功能:
  • 结束当前动画的执行。
  • 清理与动画相关的资源或状态。
  • 可能用于将场景中对象恢复到原始状态。
使用场景:
  • 在执行完一系列动画后,可以调用该方法来确保所有动画都妥善结束。
  • 用于在某些条件下强制停止正在运行的动画。

示例:

self.animate_object() # 开始动画 # 一些操作 
self.end_animation() # 结束动画 
注意事项:
  • 确保在合适的时间调用 end_animation() 以避免状态不一致,比如在动画完成后或在出现错误需要强制停止时。
  • 不同的动画库可能有不同的实现,确保查看相关文档以了解其确切用途。

 

3. start_animation函数

start_animation(warm_up=True, flow_speed=1, time_width=0.3, rate_func=<function linear>,
 line_animation_class=<class 'manim.animation.indication.ShowPassingFlash'>, **kwargs)

该函数用于启动流动动画。

参数说明:
  • warm_up: 一个布尔值,控制是否在动画开始前进行预热。预热可以使得动画初期更平滑。

    • 示例warm_up=True 会在开始动画之前预热。
  • flow_speed: 表示流动动画的速度。值越大,流动越快。通常使用一个比例值。

    • 示例flow_speed=2 表示流动的速度是正常速度的两倍。
  • time_width: 控制动画在时间维度上的宽度,影响流动的持续时间。值越大,流动的时间宽度越长。

    • 示例time_width=0.5 表示动画在时间维度上更宽。
  • rate_func: 一个函数,用于控制动画随着时间变化的方式。可以使用内置的函数如 linearsmooth, 或者自定义的 easing 函数。

    • 示例rate_func=there_and_back 表示动画会先前进然后再退回。
  • line_animation_class: 指定用来进行线条动画的类。默认是 ShowPassingFlash,可以替换成其他的动画类来改变效果。

    • 示例line_animation_class=ShowIncreasingSubsets 使用不同的动画类来展示。
  • **kwargs: 其他参数,通常用来传递特定控制动画的额外选项,具体取决于line_animation_class。

示例:

self.start_animation(warm_up=True, flow_speed=1.5,
 time_width=0.5, rate_func=smooth) 

这个示例准备启动流动动画,使用 1.5 的流动速度,时间宽度为 0.5。动画的变化速率采用平滑效果。


应用实例 1:

class StreamLineCreation(Scene):
    def construct(self):
        func = lambda pos: (np.sin(pos[0]) * UR + np.cos(pos[1]) * LEFT) - pos
        stream_lines = StreamLines(
            func,
            color=YELLOW,
            x_range=[-7, 7, 1],
            y_range=[-4, 4, 1],
            stroke_width=3,
            virtual_time=1,  # use shorter lines
            max_anchors_per_line=5,  # better performance with fewer anchors
        )
        self.play(stream_lines.create())  # uses virtual_time as run_time
        self.wait()

 应用实例 2:

from manim import *

class EndAnimation(Scene):
    def construct(self):
        func = lambda pos: np.sin(pos[0] / 2) * UR + np.cos(pos[1] / 2) * LEFT
        stream_lines = StreamLines(
            func, stroke_width=3, max_anchors_per_line=5, virtual_time=1, color=BLUE
        )
        self.add(stream_lines)
        stream_lines.start_animation(warm_up=False, flow_speed=1.5, time_width=0.5)
        self.wait(1)
        self.play(stream_lines.end_animation())

  应用实例 3:

from manim import *

class ContinuousMotion(Scene):
    def construct(self):
        func = lambda pos: np.sin(pos[0] / 2) * UR + np.cos(pos[1] / 2) * LEFT
        stream_lines = StreamLines(func, stroke_width=3, max_anchors_per_line=30)
        self.add(stream_lines)
        stream_lines.start_animation(warm_up=False, flow_speed=1.5)
        self.wait(stream_lines.virtual_time / stream_lines.flow_speed)

总结:

这些参数允许有效地控制动画的性质,包括持续时间、流动速度、延迟情况、以及整体动画表现的风格和流动特性。通过调整这些参数,您能够创建出更丰富、更动感的动画效果。如果您还有其他疑问或需要进一步的说明,请告诉我!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx和tomcat负载均衡

文章目录 一&#xff0c;tomcat1.tomca用途2.tomcat重要目录 二&#xff0c;nginx1.Nginx应用2.nginx作用3.nginx的正向代理和反向代理3.1正向代理3.2反向代理(单级)3.3反向代理(多级) 4.nginx负载均衡4.1Nginx支持的常见的分流算法1. 轮询(Round Robin):2.最少连接数(LeastCon…

OLED整体刷新到结合switch刷新方式演变

OLED整体刷新到结合switch刷新方式演变 引言 OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。 至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的…

[ 全部搞定 - 发票导出表格 ] PDF发票提取到表,图片发票提取到表格,扫描件发票提取到表格,全电发票PDF,全电发票扫描件识别导出EXCEL表格

最近很多朋友说找PDF发票提取Excel表格的&#xff0c;找到了图片识别Excel表格的&#xff0c;有的找图片识别Excel表格的&#xff0c;找到了PDF发票提取表格的&#xff0c;所以就很难搞&#xff0c;还有的说都想要 今天一篇文章&#xff0c;全部搞定所有发票【电子发票&#x…

运维学习————nginx3-keepalived及高可用nginx集群

目录 一、高可用nginx规划图 二、克隆一个nginx 启动测试 ​编辑 三、keepalived简介 四、安装配置keepalived保活nginx 4.1、安装 ​编辑 4.2、配置 4.2.1、主机配置&#xff08;nginx1(主)配置&#xff09; 4.2.2、从机配置&#xff08;nginx2(主)配置&#xff09;…

敏捷架构框架:数字化转型的核心驱动力

在数字化转型的浪潮中&#xff0c;传统的企业架构和组织结构正面临严峻挑战。为了在快速变化的市场环境中保持竞争力&#xff0c;企业不仅需要灵活的开发流程&#xff0c;还需要一种能够支持敏捷方法的架构体系。《数字化时代的敏捷架构》提出的敏捷架构框架&#xff08;Agile …

建筑物规则化(实现) --- 特征边分组、重构、直角化

规则化建筑物 一、摘 要 建筑物多边形在地图综合中的两类处理模型:化简与直角化。 建筑物矢量数据来源广泛&#xff0c;在数据获取过程中&#xff0c;受GPS精确度、遥感影像分辨率或人为因素的影响&#xff0c;数据往往存在不同程度的误差。其中&#xff0c;图像分割、深度学习…

规范化JavaBean

Java Bean 是一个很常见的概念&#xff0c;简单来说就是一个 Java 类&#xff0c;其中的内容就是各种属性&#xff0c;以及各个属性的 getter/setter 。例如&#xff1a; class Student {private String name;private int age;public String getName() {return this.name;}pub…

网络协议与Netty

1、讲一讲什么是RPC&#xff1f; 说到RPC就必须要聊一聊单体项目和分布式/微服务项目 单体项目时&#xff1a;一次服务调用发生在同一台机器上的 同一个进程内部 &#xff0c;也就是说调用发生在本机内部&#xff0c;因此也被叫作本地方法调用。 分布式/微服务项目时&#x…

负载均衡:定义与核心作用

负载均衡&#xff1a;定义与核心作用 一、负载均衡的定义二、负载均衡的核心作用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 负载均衡&#xff0c;作为网络技术的重要一环&#xff0c;对优化资源利用和提升服务器响应速度至关重要。本文…

Ps:首选项 - 界面

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“界面” Interface选项卡可以定制 Photoshop 的界面外观和行为&#xff0c;从而创建一个最适合自己工作习惯和需求的工作环境。这些设置有助于提高工作效率&#xff0c;减轻眼…

快速带你玩转高性能web服务器

目录 一.Web 服务基础介绍 ​编辑1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache的图标 1.2.2 NGINX的图标&#xff1a; 1.2.3 Apache 经典的 Web 服务端 1.2.3.1 Apache prefork 模型 1.2.3.2 Apache worker 模型 1.2.3.3 Apache event模型 1.2.4 Nginx-高性能的 Web …

PanDownload 网页复刻版最新PHP源码

源码介绍 PanDownload 网页复刻版&#xff0c;PHP语言版&#xff0c;PanDownload在线解析下载的优点&#xff0c;速度快&#xff0c;受用户自身带宽限制&#xff0c;就是说你的宽度交多少决定你下载的速度&#xff0c;不用下载百度网盘客户端&#xff0c;你可以直接使用解析所…

PingCAP 携手 CCF 数据库专委会打造“开源数据库领域拔尖创新人才培育计划”,共塑数据库教育未来丨NDBC 2024

2024 年 8 月 7 日 - 10 日&#xff0c;由中国计算机学会主办、中国计算机学会数据库专业委员会和新疆大学承办、新疆 IT 三会等单位协办的第 41 届中国数据库学术会议&#xff08;NDBC 2024&#xff09;在新疆乌鲁木齐成功举办。 大会上 PingCAP 联合创始人黄东旭发表了主题演…

LabVIEW深度监测系统

随着果园机械化作业的迅速发展&#xff0c;传统的人工监测方式已难以满足现代农业的高效率与精准性需求。本文介绍了一种基于LabVIEW软件的果园开沟深度监测系统&#xff0c;该系统通过集成先进的传感技术与数据处理算法&#xff0c;实现了对开沟深度的实时精确监测和自动控制&…

11.SPI通信

SPI理论 常规四线&#xff1a;SCLK、CS、MOSI(主向从发)、MISO(从向主发) 同步、串行、全双工、速率(MHz) 一主一从、一主多从、不能多主 工作模式&#xff1a; CPOL 0&#xff1a;总线空闲状态时钟为低电平&#xff0c;1&#xff1a;总线空闲状态时钟为高电平 CPHA 0&#…

【Python系列】执行 Shell 命令的六种方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

0.91寸OLED迷你音频频谱

一、简介 音频频谱在最小0.91寸OLED 屏幕上显示&#xff0c;小巧玲珑 二、应用场景 本模块为音频频谱显示模块&#xff0c;用来获取声音频谱并展示频谱&#xff0c;跟随音乐声音律动 三、产品概述 基于主控芯片设计的将声音采集分析频谱&#xff0c;显示到0.91寸OLED的功能…

【Git】常见命令的使用

Git 介绍流程安装常见命令本地仓与远程仓关联 介绍 Git、Svn&#xff1a;版本控制器&#xff08;用于多人团队协作&#xff09; Svn&#xff1a;集中式版本控制器&#xff1b;版本库集中放在中央服务器&#xff0c;操作非常简单&#xff0c;鼠标右键提交、新增、下载 Git&…

华为OD机试 - 模拟目录管理 - 栈(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

博弈论,CF 1600E - Array Game

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1600E - Array Game 二、解题报告 1、思路分析 记最长递增前缀长度为L&a…