manim边学边做--局部变换

news/2025/2/4 10:17:11/文章来源:https://www.cnblogs.com/wang_yb/p/18697995

本次介绍的两个用于变换的动画类: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 会自动尝试匹配相似的形状并进行转换,这里由于形状类型不同,会进行相应的变形动画。

# 创建起始形状
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 会按照我们指定的规则进行形状转换。

# 创建起始形状
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 会将分组的部分作为一个整体进行匹配和转换。

# 创建起始公式
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)

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

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

相关文章

读算法简史:从美索不达米亚到人工智能时代06人工智能现身

读算法简史:从美索不达米亚到人工智能时代06人工智能现身1. 人工智能现身 1.1. 在20世纪四五十年代,计算机在本质上被看成一种快速计算器1.1.1. 主机一个接一个地运行大量的数据处理作业(job),不与用户发生交互1.1.2. 最终的大量打印结果由操作员按批次(batch)展示给他们心怀…

2025 大盘

调整的差不多了 年后看3065附近

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外,还有一个小众的市场,那就是多媒体展厅场景,这个场景目前处于垄断地位的软件是HirenderS3,做的非常早而且非常全面,都是通用的需求,这个场景需求,在播放这块,有几个明显的需求是,播放的视…

FFT+NTT入门

这是一个题图真的只是入门。 可能会接着更 分治FFT 或者 任意模数NTT? 前置知识 复数 也可以参考高中数学课本,这里只会介绍 fft 需要的(默认已经入门复数)。 多项式的相关概念。 点值表示法:假设 \(f(x)\) 是一个 \(n-1\) 次多项式,那么将 \(n\) 个 不同的 \(x\) 代入,…

Traefik新一代反代服务器,兼容所有主要的集群技术(二)

简介 笔记将记录如何使用docker配置traefik,代理一个gitea,自动申请tls证书,cloudflare反代80,443端口一系列实操。 daemon.json配置如下,主要是为了IPv6能访问,以及更改了主存储位置,配置了docker代理。{"data-root": "/storage/docker","ipv6…

macbookpro m3本地部署DeepSeek模型

macbookpro m3有着十分强大的性能。在deepseek如火如荼的当下,可以尝试在本地部署并使用。还可以将自己的文档作为语料喂给deepseek,使其能成为自己专属的AI助手。 本文介绍使用ollama在本地部署deepseek模型,并使用chatbox优化访问的步骤。 下载ollama https://ollama.com …

基于生成式AI的访问控制, 迁移传统安全策略到基于LLM的风险分类器

基于规则的风险分类风险分类是网络安全系统的核心能力之一,它将访问请求和命令映射到其风险级别/类别:高(High)、中(Medium)、低(Low)。目前,即便是在大规模环境中,风险分类器仍主要采用基于规则的系统实现。基于规则的分类器易于以符合人类直觉的方式定义——这也使…

坐标系与向量

坐标系规定 一般使用左手坐标系,+x,+y,+z分别指向右方、上方、前方。 多坐标系 世界坐标系:协议某个点为原点,其他所有点都有具体不变的坐标,能够用世界坐标系描述其他坐标系的位置,而不能使用更大的、外部的坐标系来描述世界坐标系。 物体坐标系:和物体相关联的坐标…

Netty实战入门教程

概述 Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端 Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位 以下的框架都使用了 Netty,因为它们有网络通信需求!Cassandra - nosql 数据库 Spark…

FFT入门

这是一个题图前置知识 复数 也可以参考高中数学课本,这里只会介绍 fft 需要的(默认已经入门复数)。 多项式的相关概念。 点值表示法:假设 \(f(x)\) 是一个 \(n-1\) 次多项式,那么将 \(n\) 个 不同的 \(x\) 代入,可以得到 \(n\) 个 \(y\)。这 \(n\) 个点对 \((x,y)\) 唯一…

GPUStack:一个开源的GPU集群管理和自动化部署大模型的LLM服务平台

正如我们以前文章中说过,在过去近两年中,AI发展速度超过任何历史时期,基于大模型的各类应用已经渗透到了各行各业中,很多企业都在积极探索如何利用大模型提高公司运营管理的能效。 阿里云 CTO 周靖人也说过““当下企业应用大模型存在三种范式:一是对大模型开箱即用,二是…

Deskflow:一个能在多个设备之间共享鼠标键盘的工具

有多台设备的同学肯定都感受过切换鼠标和键盘的痛苦。比如家里有个台式机配了键盘和鼠标,工作有台笔记本,但是如果想用家里的键盘和鼠标操作笔记本那么除了插拔线(蓝牙也一样),好像没有其他特别的办法。 以为我个人为例,插拔切换鼠标键盘,最头疼的就是以下两个点: 线缆…