manim边学边做--局部变换

本次介绍的两个用于变换的动画类:TransformMatchingShapesTransformMatchingTex

它们的主要特点是对一组对象或一段文本进行局部变换,适用于复杂的图形或者文本的变换场景。

其中:

  1. TransformMatchingShapes:用于不同形状的 VMobject 间转换,能自动匹配相似形状并创建平滑过渡动画,也支持手动指定匹配方式,适用于图形拼接、拆分等场景
  2. TransformMatchingTex:专门处理 LaTeX 文本对象转换,可自动匹配相同文本片段进行动画过渡,支持分组匹配,且保留文本样式,常用于数学公式推导、文本替换场景

1. 动画概述

1.1. TransformMatchingShapes

TransformMatchingShapes 主要用于在两个包含多个不同形状(如圆形、正方形、三角形等)的 VMobject 之间进行动画转换。

当你想要将一组形状变换为另一组形状,并且希望相似的形状之间能够自然地过渡时,这个类就非常有用。

例如,在数学动画中,将一个由几个三角形组成的图案变换为一个由几个正方形组成的图案;

或者在展示图形的拼接和拆分过程中,将一个复杂图形拆分成多个简单图形,再重新组合成另一个复杂图形。

它的参数主要有:

参数名称 类型 说明
mobject Mobject 动画起始的对象,也就是需要进行形状转换的初始对象
target_mobject Mobject 动画结束的目标对象
transform_mismatches bool 是否对不匹配的子对象进行转换
fade_transform_mismatches bool 是否淡化不匹配子对象的转换效果
key_map dict 自定义子对象的匹配规则

TransformMatchingShapes 会自动识别两个 VMobject 中相似的形状,并在这些相似形状之间创建动画过渡。

相似性通常基于形状的类型(如圆形、正方形)和相对大小。

transform_mismatches参数是控制是否对于没有自动匹配的对象也进行转换。

除了自动匹配,也可以通过key_map参数指定形状的匹配方式,这在自动匹配无法满足需求时非常有用。

例如,你可能希望将一个圆形匹配到一个椭圆形,或者将一个不规则形状匹配到另一个特定的不规则形状。

它的主要方法有:

名称 说明
get_mobject_key 用于获取与对象相关的关键信息
get_mobject_parts 用于获取对象的各个组成部分

1.2. TransformMatchingTex

TransformMatchingTex 专门用于处理 LaTeX 文本对象之间的动画转换。

在数学公式推导、文本替换等场景中非常有用。

例如,在讲解数学公式的推导过程时,将一个公式逐步变换为另一个公式;

或者在展示文本的替换过程中,将一个单词或短语替换为另一个单词或短语。

在转换过程中,TransformMatchingTex 会保留文本的样式(如字体、颜色、大小等),使得转换后的文本与原始文本具有一致的外观。

TransformMatchingTex 参数和方法和TransformMatchingShapes是一样的。

2. 使用示例

下面通过示例来演示如何使用这两个局部变换的动画类。

2.1. 自动形状转换

这个示例中,我们创建了一个包含圆形,正方形,星形和正八边形的 VGroup 作为起始形状,

另一个包含正八边形,星形,三角形和菱形的 VGroup 作为目标形状。

TransformMatchingShapes 会自动尝试匹配相似的形状并进行转换,这里由于形状类型不同,会进行相应的变形动画。

python 复制代码
# 创建起始形状
start_shapes = VGroup(
    Circle(color=BLUE),
    Square(color=RED),
    Star(color=GREEN),
    RegularPolygon(n=8, color=YELLOW),
)
# 创建目标形状
end_shapes = VGroup(
    RegularPolygon(n=8, color=YELLOW),
    Star(color=GREEN),
    Triangle(color=BLUE),
    RegularPolygon(n=4, color=RED),
)

self.add(start_shapes)
self.wait()
# 使用 TransformMatchingShapes 进行转换
self.play(
    TransformMatchingShapes(
        start_shapes,
        end_shapes,
        transform_mismatches=True,
    ),
)

从动画可以看出,各种原始图形自动变换为跟自己最为接近的图形:

  1. 蓝色圆形自动匹配转换为黄色正八边形
  2. 红色正方形转换为红色的菱形
  3. 黄色正八边形转换为蓝色三角形
  4. 绿色的星形没变

2.2. 自定义形状转换

在这个示例中,我们除了创建起始和目标形状外,还定义了一个 key_map 字典来指定自定义的形状匹配规则。

这样,TransformMatchingShapes 会按照我们指定的规则进行形状转换。

python 复制代码
# 创建起始形状
start_shapes = VGroup(
    Circle(color=BLUE),
    Square(color=RED),
    Star(color=GREEN),
    RegularPolygon(n=8, color=YELLOW),
)
# 创建目标形状
end_shapes = VGroup(
    RegularPolygon(n=8, color=YELLOW),
    Star(color=GREEN),
    Triangle(color=BLUE),
    Square(color=RED),
)

self.add(start_shapes)
self.wait()

# 自定义匹配规则
key_map = {
    Circle: Triangle,
}

# 使用 TransformMatchingShapes 并指定自定义匹配规则
self.play(
    TransformMatchingShapes(
        start_shapes,
        end_shapes,
        key_map=key_map,
        transform_mismatches=True,
    ),
)

从动画可以看出,根据key_map参数,蓝色圆形被转换为蓝色的三角形,

而上一节自动匹配时,蓝色圆形是自动匹配转换为黄色正八边形的。

2.3. 公式转换示例

这个示例中,我们使用MathTex创建一些公式,公式中用{{ }}对需要转换的对象进行分组。

TransformMatchingTex 会将分组的部分作为一个整体进行匹配和转换。

python 复制代码
# 创建起始公式
f1 = (
    VGroup(
        MathTex("a", color=RED),
        MathTex("b", color=GREEN),
        MathTex("c", color=YELLOW),
    )
    .arrange(RIGHT, buff=1)
)
# 创建目标公式
f2 = MathTex("{{x}}^2", "+", "{{y}}^2", "=", "{{z}}^2")
f3 = MathTex("{{a}}^2", "+", "{{b}}^2", "=", "{{c}}^2")

self.add(f1, f2)
self.wait()
# 使用 TransformMatchingTex 进行转换
self.play(TransformMatchingTex(VGroup(f1, f2), f3))

f4 = MathTex("{{a}}^2", "=", "{{c}}^2", "-", "{{b}}^2")
self.play(TransformMatchingTex(f3, f4))

f5 = MathTex("{{b}}^2", "=", "{{c}}^2", "-", "{{a}}^2")
self.play(TransformMatchingTex(f4, f5))

3. 总结

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

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

相关推荐
aiweker6 分钟前
Python处理数据库:MySQL与SQLite详解
数据库·python
Amd79432 分钟前
Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践
python·postgresql·数据分析·开发·最佳实践·psycopg2·数据库集成
查理零世1 小时前
【算法】回溯算法专题③ ——排列型回溯 python
python·算法·深度优先
Ethel L1 小时前
Python - pyautogui库 模拟鼠标和键盘执行GUI任务
python
游王子3 小时前
Python NumPy(6):修改数组形状、翻转数组、修改数组维度
开发语言·python·numpy
枫叶落雨2224 小时前
15JavaWeb——Maven高级篇
linux·python·maven
流形填表5 小时前
用FormLinker实现自动调整数据格式,批量导入微软表单
python·microsoft·flask
qwe3526336 小时前
自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
python
广药门徒6 小时前
用Python替代OpenMV IDE显示openmv USB 图像
开发语言·ide·python