manim边学边做--同伦变换
在Manim中,移动一个元素除了之前介绍的方法之外,还可以通过同伦运算来移动一个元素。
与普通的移动元素方式相比,使用同伦运算移动一个元素时,实际上是在考虑整个空间的连续变形过程中元素的相应变化。
这种移动不是孤立地看待元素的位置改变,而是将元素置于空间的整体结构中,通过连续变形的方式实现元素的 “移动”。
简单来说,元素的同伦移动是通过连续变形实现的,不存在突然的跳跃或中断。
在同伦运算中,元素的每一个中间状态都与前后状态连续过渡,保持了整个移动过程的连贯性。
Manim中关于同伦移动的动画类主要有:
ComplexHomotopy:用于展示复函数之间的同伦变换Homotopy:更通用的同伦动画效果类,它可以用于展示任意两个对象之间的同伦变换,不仅仅局限于复函数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. 补充说明:什么是同伦运算
同伦运算是代数拓扑学中的概念,本质上是在同伦范畴中对映射或空间的操作。
从直观上来说,如果两个连续映射 可以通过连续变形从一个变成另一个,那么这两个映射是同伦的,而对这些同伦的映射进行的各种操作和研究就是同伦运算的范畴。
具体的数学定义这里不赘述,举几个实际生活中可以当做同伦变换的例子来帮助大家理解一下:
- 揉面团:把一块面团从初始的球形揉成各种形状,比如椭圆形、扁平状,甚至可以在面团上捏出一些起伏但不切断面团。这个过程中,面团的形状发生了连续变化,但它始终是一个整体,没有被撕裂或粘连,不同形状之间存在同伦关系。
- 吹气球:从气球未吹气时的扁平状态,到逐渐吹起变成球形的过程,气球的表面在连续地扩张变形。只要气球没有破裂,这个过程就是一个连续的变换。
- 绳结的变换:在不剪断绳子和不使绳子打结部分相互穿越的前提下,绳结可以从一种形状连续地变换为另一种形状。
- 衣服的变形:一件衣服在被人穿着的过程中,随着人的动作,衣服会发生各种变形。比如从平整的挂在衣架上的状态,到穿在人身上随着身体的弯曲、伸展而改变形状。
- 等等... ...
注意,上面的示例可以帮助理解同伦变换,但并不是完全严谨的同伦变换,
比如,面团弄断了,衣服撕裂了等等情况就不是同伦变换,但却是实际生活中经常发生的事。
manim边学边做--同伦变换的更多相关文章
- 学EE做硬件找工作不如学CS做软件,为什么会这样?
学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...
- 牛腩学Kotlin做Android应用
牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...
- php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...
- html5-3 html5标签(热点地图如何实现)(边学边做)
html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl 自定义列表dt 自定义标题dd 自定义列表内容 2. ...
- 第一份开发工作,边学边做android
我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...
- 边学边做,简单的 GraphQL 实例
项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...
- LabVIEW Actor Framwork (2)________ 边学边做server&client
回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...
- STM32F103VET6 ADC采集64点做FFT变换
http://www.stmcu.org/module/forum/thread-598459-1-11.html http://bbs.21ic.com/icview-589756-1-1.html ...
- 牛腩学ASP.NET CORE做博客(视频)
牛腩学习ASP.NET CORE做的项目,边学边做. 目录: 01-dotnetcore网站部署到centos7系统上(时长 2:03:16) 02-前期准备及项目搭建 (时长:0:23:35) 03 ...
- 牛腩学用MUI做手机APP
斗鱼直播间直播学习撸码,最终目标是用MUI做一个手机APP(暂定android平台,攒钱买IPHONE 7SE!!!),直播内容含整个软件APP的制作过程(含后台接口的制作,放到自己买的阿里云服务器, ...
随机推荐
- mysql进阶-锁
锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源. 如何保证数据并发访问的一致性.有效性 ...
- 9.24 csp(没学会的网络流)
T1.商品 因为边界 l , r 是线性移动的,所以答案可以线性改变,直接用set维护连续段(小于l的和大于r的)的个数,并维护ans即可. 因为set的一个小错误调了两个小时,代码打成了一坨,结果最 ...
- HarmonyOS NEXT开发之ArkTS自定义组件学习笔记
在HarmonyOS中,ArkTS提供了创建自定义组件的能力,允许开发者封装和复用UI代码.以下是关于自定义组件的详细介绍,包括创建自定义组件.页面和自定义组件的生命周期.自定义组件的自定义布局.冻结 ...
- 新东方在有状态服务 In K8s 的实践
作者|周培,新东方架构部容器组专家 有状态服务建设一直以来都是 K8s 中非常具有挑战性的工作,新东方在有状态服务云化过程中,采用定制化 Operator 与自研本地存储服务结合的模式,增强了 K8s ...
- OpenFunction v0.8.0 发布:通过 Dapr Proxy 加速函数启动
相较于其他函数计算项目,OpenFunction 有很多独特的功能,其中之一便是通过 Dapr 与各种后端服务(BaaS)无缝集成.目前 OpenFunction 已经支持了 Dapr 的 pub/s ...
- Java 当中使用 “google.zxing ”开源项目 和 “github 的 qrcode-plugin” 开源项目 生成二维码
Java 当中使用 "google.zxing "开源项目 和 "github 的 qrcode-plugin" 开源项目 生成二维码 @ 目录 Java 当中 ...
- LLM应用实战: OpenAI多代理新作-Swarm
1.背景 本qiang~关注到OpenAI两周前发布的轻量级多代理框架Swarm,因此想要深入了解了一下,运行了官方提供的例子,整理并总结一些心得体会~ 源码非常简单,各位看官们可以小读一下,本文采用 ...
- Java 面试用什么项目?全是商场秒杀 RPC,我吐了
看了几百份简历,真的超过 90% 的小伙伴的项目是商城.RPC.秒杀.论坛.外卖.点评等等烂大街的项目,人人都知道这些项目烂大街了,但大部分同学还是得硬着头皮做,没办法,网络上能找到的.教程比较完善的 ...
- 记录:coding持续集成之自动发布项目
把一个SpringBoot项目在DevOps一站式研发平台coding编译成jar远程部署到服务器分为几步?答:3步. 1.编译生成构建产物-jar包: 2.SCP 上传到远端服务器: 3.远程执行s ...
- 第三篇:低功耗模组Air724UG硬件设计手册
今天我们分享最后一篇. 3.20 省电功能 根据系统需求,有两种方式可以使模块进入到低功耗的状态.对于AT版本使用"AT+CFUN"命令可以使模块 进入最少功能状态. 具体的功 ...