在Manim
库中,除了常规的元素移动方法,还可以通过同伦变换(Homotopy)来实现元素的移动。同伦变换不仅仅是简单的位置变化,而是在空间连续变形的过程中考虑元素的变化。这种移动方式避免了突变和中断,保证了整个移动过程的连续性和流畅性。
同伦变换将元素的移动视为空间整体结构的一部分,通过连续变形实现元素的“移动”。在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) $的同伦变换过程。通过在复平面上创建一系列的点来模拟这个变换的过程。
```python
创建复平面
plane = ComplexPlane(
x_range=[-8, 8],
y_range=[-8, 8],
x_length=6,
y_length=6,
)
self.add(plane)