manim边学边做--同伦变换

news/2024/12/25 8:41:11/文章来源:https://www.cnblogs.com/wang_yb/p/18629168

Manim中,移动一个元素除了之前介绍的方法之外,还可以通过同伦运算来移动一个元素。

与普通的移动元素方式相比,使用同伦运算移动一个元素时,实际上是在考虑整个空间的连续变形过程中元素的相应变化。

这种移动不是孤立地看待元素的位置改变,而是将元素置于空间的整体结构中,通过连续变形的方式实现元素的 “移动”。

简单来说,元素的同伦移动是通过连续变形实现的,不存在突然的跳跃或中断。

在同伦运算中,元素的每一个中间状态都与前后状态连续过渡,保持了整个移动过程的连贯性。

Manim中关于同伦移动的动画类主要有:

  1. ComplexHomotopy:用于展示复函数之间的同伦变换
  2. Homotopy:更通用的同伦动画效果类,它可以用于展示任意两个对象之间的同伦变换,不仅仅局限于复函数
  3. SmoothedVectorizedHomotopy:对向量场进行平滑的同伦变换

1. 动画概述

1.1. ComplexHomotopy

ComplexHomotopy通常需要接收两个复函数作为参数,通过在复平面上对这两个函数进行采样,得到一系列的复数点。

然后,在动画过程中,按照一定的插值方法,逐步将第一个函数对应的点变换到第二个函数对应的点。

它的参数主要有:

参数名称 类型 说明
complex_homotopy func 定义了复平面上的同伦变换规则的函数
mobject Mobject 要应用同伦变换的数学对象

complex_homotopy参数是一个函数,它接受一个复数作为参数,并返回一个浮点数。

1.2. Homotopy

Homotopy需要定义起始对象和目标对象,以及一个描述同伦过程的函数。

在动画运行时,根据时间参数,通过同伦函数计算出每个时刻对象的中间状态,

这个中间状态的计算可能涉及到对象的几何属性(如点的坐标、图形的形状参数等)的插值和变换。

它的参数主要有:

参数名称 类型 说明
homotopy func 定义了对象在动画过程中的变形规则的函数
mobject Mobject 要应用同伦变换的数学对象
apply_function_kwargs dict 在应用同伦变换函数时提供额外的控制或配置信息

homotopy参数是一个参数,它接受四个数$ (x,y,z,t) \(作为参数,分别表示对象在三维空间中的坐标\) (x,y,z) \(以及动画时间参数\) t $(的取值范围从 0 到 1),

并返回一个包含三个数的元组$ (x',y',z') \(,表示在时间\) t $时,原始坐标对应的点经过同伦变换后的新坐标。

1.3. SmoothedVectorizedHomotopy

SmoothedVectorizedHomotopy首先需要获取起始向量场和目标向量场的信息,例如向量的大小和方向。

在动画过程中,通过一种平滑的插值算法来计算中间时刻向量场的向量值,这种算法可能会考虑向量场的梯度、散度等属性,以确保向量的变化是连续且符合物理规律的。

在每一帧动画中,根据计算得到的向量值绘制出相应的向量场,展示出向量场的平滑同伦变换。

它的参数主要有:

参数名称 类型 说明
homotopy func 定义了对象在动画过程中的变形规则的函数
mobject Mobject 要应用同伦变换的数学对象
apply_function_kwargs dict 在应用同伦变换函数时提供额外的控制或配置信息

SmoothedVectorizedHomotopy参数和Homotopy参数的含义是一样的。

SmoothedVectorizedHomotopy侧重于向量场的平滑同伦变换,虽然参数类似但主要针对向量场,确保其变换过程平滑,在涉及向量场的场景(如物理场模拟)中发挥独特作用。

2. 使用示例

这几个同伦变换的类使用起来没有那么直观,下面通过几个示例来演示如何使用这些类。

2.1. 复函数同伦变换展示

这个示例利用ComplexHomotopy展示了复函数$ f(z)=e^z \(到\) g(z)=sin(z) $的同伦变换过程。

通过在复平面上创建一系列的点来模拟这个变换的过程。

# 创建复平面
plane = ComplexPlane(x_range=[-8, 8],y_range=[-8, 8],x_length=6,y_length=6,
)
self.add(plane)# 定义两个复函数
def f(z):return np.exp(z)def g(z):return np.sin(z)# ComplexHomotopy动画
homotopy = lambda z, t: (1 - t) * f(z) + t * g(z)
# 要应用动画的点集
points = [complex(x, y) for x in np.arange(-3, 3, 0.5) for y in np.arange(-3, 3, 0.5)
]
mobject = VGroup(*[Dot(plane.n2p(p)) for p in points])
self.add(mobject)
self.play(ComplexHomotopy(homotopy, mobject),run_time=3,
)

2.2. 圆形的同伦收缩演示

借助Homotopy实现圆形在三维空间沿轴逐渐收缩为点的动画,

展示拓扑学中同伦变换下几何图形的连续变化,辅助理解拓扑性质。

# 创建一个圆形
circle = Circle(radius=2)
self.add(circle)# 定义同伦函数
def homotopy(x, y, z, t):return (x * (1 - t), y * (1 - t), z)# 创建Homotopy动画
self.play(Homotopy(homotopy, circle),run_time=3,
)

2.3. 向量场强度均匀减弱模拟

通过SmoothedVectorizedHomotopy呈现二维向量场强度随时间均匀减弱,

在物理学电场或磁场教学中,能有效帮助学生理解向量场动态变化。

# 创建一个向量场
vector_field = ArrowVectorField(lambda pos: (pos[0], pos[1], 0)
)
self.add(vector_field)# 定义同伦函数
def homotopy(x, y, z, t):return ((1 - t) * x, (1 - t) * y, 0)# SmoothedVectorizedHomotopy动画
self.play(SmoothedVectorizedHomotopy(homotopy, vector_field),run_time=3,
)

3. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(homotopy.py),

下载地址: 完整代码 (访问密码: 6872)

4. 补充说明:什么是同伦运算

同伦运算是代数拓扑学中的概念,本质上是在同伦范畴中对映射或空间的操作。

从直观上来说,如果两个连续映射 可以通过连续变形从一个变成另一个,那么这两个映射是同伦的,而对这些同伦的映射进行的各种操作和研究就是同伦运算的范畴。

具体的数学定义这里不赘述,举几个实际生活中可以当做同伦变换的例子来帮助大家理解一下:

  1. 揉面团:把一块面团从初始的球形揉成各种形状,比如椭圆形、扁平状,甚至可以在面团上捏出一些起伏但不切断面团。这个过程中,面团的形状发生了连续变化,但它始终是一个整体,没有被撕裂或粘连,不同形状之间存在同伦关系。
  2. 吹气球:从气球未吹气时的扁平状态,到逐渐吹起变成球形的过程,气球的表面在连续地扩张变形。只要气球没有破裂,这个过程就是一个连续的变换。
  3. 绳结的变换:在不剪断绳子和不使绳子打结部分相互穿越的前提下,绳结可以从一种形状连续地变换为另一种形状。
  4. 衣服的变形:一件衣服在被人穿着的过程中,随着人的动作,衣服会发生各种变形。比如从平整的挂在衣架上的状态,到穿在人身上随着身体的弯曲、伸展而改变形状。
  5. 等等... ...

注意,上面的示例可以帮助理解同伦变换,但并不是完全严谨的同伦变换

比如,面团弄断了,衣服撕裂了等等情况就不是同伦变换,但却是实际生活中经常发生的事。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

破解多区域协作难题,打造无缝连接新生态,让企业效率倍增!

跨国公司在全球范围内拥有多个分支机构、生产基地和供应链,为了实现高效的运营和多区域协作,跨国公司需要建立稳定、安全的网络连接,确保不同地区之间的数据传输顺畅。例如,苹果、微软、可口可乐等全球知名企业均在全球范围内进行商品和服务的国际贸易、资本投资以及资产配…

网站迁移处理-云服务器问题

关于您提到的网站迁移过程中遇到的问题,包括数据丢失、文件丢失以及迁移前后不一致的情况,我们将为您提供详细的解决方案。确保在迁移过程中不会出现数据丢失和文件丢失,并且迁移后的网站与原网站保持一致是至关重要的。以下是具体的排查和解决步骤:备份与恢复: 在进行任何…

域名解析很久始终无法访问

关于您提到的域名解析很长时间但始终无法访问的问题,这可能是由于DNS传播延迟、服务器配置错误或解析设置不当引起的。为了帮助您顺利解决问题,建议您从以下几个方面进行排查和调整:DNS传播延迟: 域名解析通常需要一定的时间才能在全球范围内传播。DNS传播时间可能从几分钟…

无法访问网站-虚拟主机/数据库问题

关于您提到的无法访问网站的问题,可能是由多种原因引起的,包括DNS解析错误、服务器配置问题、数据库连接失败等。为了帮助您顺利解决问题,建议您从以下几个方面进行排查和调整:域名解析检查: 首先,请确认域名解析是否正常。DNS传播可能需要一定时间才能在全球范围内生效。…

Fortify:静态代码分析器

Fortify静态代码分析器,‌是一款强大的静态代码分析工具,主要用于检测源代码中的安全漏洞和缺陷。它支持多种编程语言,包括Java、C#、C、C++、Swift、PHP等,能够发现并修复潜在的代码泄露风险点‌。 兼容系统: Windows/MacOS/Linux安装步骤 一、解压补丁压缩包,把fortify…

【安全就业】2024年网络安全技术技能人才职业能力图谱+工控安全

工控安全,是指针对工业控制系统进行网络安全保障的相关工作。由于工控系统与一般的民用办公系统、Web系统等都有很大不同,因此想要做好工控安全工作,需要掌握很多工业控制领域的专业知识和能力,具体包括资产识别、工控协议、工业安全检测(漏洞挖掘)、工业自动化、主机安全…

跟着 8.6k Star 的开源数据库,搞 RAG!

过去 9 年里,HelloGitHub 月刊累计收录了 3000 多个开源项目。然而,随着项目数量的增加,不少用户反馈:“搜索功能不好用,找不到想要的项目!” 这让我意识到,仅仅收录项目是不够的,还需要通过更智能的方式,帮助用户找到心仪的开源项目。于是,我开始探索如何通过 RAG 技…

【内网】内网远程桌面密码获取

一、远程桌面历史IP获取 1.1 mstsc查看历史登录IP 1.2 注册表地址获取历史登录IP地址 1.3 ListRDPConnections 二、获取 RDP 远程桌面连接凭据 2.1 在凭据管理器中查看 Windows 凭据 2.2 使用 Mimikatz 导出远程桌面连接凭据 2.3 从 svchost 中获取 RDP 连…

直击心灵:别让‘在吗’成为沟通障碍

在聊天过程中,我特别反感收到“在吗”的询问或是“微笑”表情。 当需要请求他人协助时,相较于冷冰冰又显敷衍的“在吗?”或是让人感觉虚伪的“微笑”表情,我更倾向于在“在吗”前加上对方的名字或昵称,随后直接切入主题。这样的沟通方式更为亲切且高效,也更容易得到对方的…

【半解决】开启代理后无法连接github仓库,开启tun模式后无法连接github仓库

背景 如图所示。问题 无法连接github仓库,代理可以正常访问外网。 PS C:\Users\acer\bin\ps> ssh -Tv git@github.com OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2 debug1: Reading configuration data C:\\Users\\acer/.ssh/config debug1: C:\\Users\\acer/.ssh/config l…

[密码管理/信息安全] 密码管理工具:KeePass vs LastPass vs 1Password [转]

序在互联网上冲浪的时候,遇到个有趣好玩的网站,想看里面内容的时候,往往就会要你注册登录。 这时候就会很崩溃,不注册的话没办法看里面的内容 注册的话,担心收到垃圾邮件,个人信息泄露,注册得不偿失(为了看一篇文章而注册一个账号) 我知道身边的一些人就是很多账号,密…

利用Spring Cloud Gateway Predicate优化微服务路由策略

Spring Cloud Gateway 的路由配置中,predicates(断言)用于定义哪些请求应该匹配特定的路由规则。断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服…