manim边学边做--MathTex
上一篇介绍的SingleStringMathTex主要用来显示只有一行的数学公式,
对于复杂的数学公式,可以使用MathTex类。
MathTex类继承自SingleStringMathTex,在其基础之上增加了更多的功能。
其实,MathTex是制作数学动画时常用的类,反而SingleStringMathTex用的不多。
MathTex在manim各个模块中的位置大致如上图中所示。
1. 主要参数
MathTex的主要参数有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| tex_strings | list | 多个latex格式的公式 |
| arg_separator | string | 多个公式之间的间隔 |
| substrings_to_isolate | list | 将公式中分离成一个个小部分 |
| tex_to_color_map | dict | 公式中不同部分的颜色设置 |
| tex_environment | str | 不熟悉latex的话不要设置 |
2. 主要方法
MathTex继承了SingleStringMathTex之后,扩展了不少新的方法,可以更好的控制和展示数学公式。
| 名称 | 说明 |
|---|---|
| get_part_by_tex | 获取 latex公式 中的一部分 |
| get_parts_by_tex | 获取 latex公式 中的多个部分 |
| index_of_part | 公式的某部分在整个公式中的索引 |
| index_of_part_by_tex | 某个tex string在整个公式中的索引 |
| set_color_by_tex | 根据某个 tex string 设置颜色 |
| set_color_by_tex_to_color_map | 用字典的形式设置多个 tex string 的颜色 |
| set_opacity_by_tex | 根据某个 tex string 设置透明度 |
| sort_alphabetically | 按字母顺序排列 latex公式 中的各个部分 |
MathTex的大部分方法都要配合substrings_to_isolate参数来一起使用,
通过substrings_to_isolate将完整的数学公式划分成一个个小部分,然后设置不同的样式。
3. 使用示例
下面的使用示例,大部分是结合参数和方法一起使用的。
3.1. 公式之间的间隔
MathTex支持输入多个公式,多个公式之间默认是空格分隔,可以通过arg_separator参数设置不同的分隔。
tex = MathTex("z", "=",
"\sqrt{x^2+y^2}")
tex = MathTex("z", "=",
"\sqrt{x^2+y^2}",
arg_separator="\quad")
\quad表示设置4个空格。
3.2. 拆分公式
拆分公式非常有用,拆分之后,可以对公式的一部分进行操作.
比如设置颜色,透明度,甚至可以在公式的不同部分应用不同的动画,做出更酷炫的展现形式。
默认情况下,公式是一个整体,哪怕用公式中的一个字符去获取,也会得到整个公式。
tex = MathTex("z=\sqrt{x^2+y^2}")
print(f"{len(tex) =}")
## 输出结果:
# len(tex) =1
part = tex.get_part_by_tex("x")
print(f"{part = }")
## 输出结果:
# part = SingleStringMathTex('z=\\sqrt{x^2+y^2}')
所以,先使用substrings_to_isolate参数拆分公式,
然后就可以使用get_part_by_tex,get_parts_by_tex这些函数来获取公式的不同部分。
tex = MathTex("y=ax^2+bx+c",
substrings_to_isolate=["x", "y"])
print(f"{len(tex) =}")
## 输出结果:
# len(tex) =6
part = tex.get_part_by_tex("y")
print(f"{part = }")
## 输出结果:
# part = SingleStringMathTex('y')
parts = tex.get_parts_by_tex("x")
print(f"{parts = }")
## 输出结果:
# parts = VGroup(SingleStringMathTex('x'),
# SingleStringMathTex('x'))
从上面的示例中看出,对于公式 \(y=ax^2+bx+c\),按\(x,y\)分割之后,
整个公式被分成了6份,所以len(tex)=6,分成了:
- \(y\)
- \(=a\)
- \(x\)
- \(^2+b\)
- \(x\)
- \(+c\)
也就是说,substrings_to_isolate中指定的\(x,y\)作为了整个公式的分割点。
tex.get_part_by_tex("y")得到的是包含\(y\)的那部分公式,因为\(y\)在substrings_to_isolate中,
所以上面示例中返回的是part = SingleStringMathTex('y')。
如果是tex.get_part_by_tex("a")的话,返回的将是part = SingleStringMathTex('=a')。
上面分成的6个部分中,有两个部分包含\(x\),
所以parts = tex.get_parts_by_tex("x")返回的VGroup包含两个元素。
通过index_of_part,index_of_part_by_tex可以根据索引来获取公式被分割的各个部分。
tex = MathTex("y=ax^2+bx+c",
substrings_to_isolate=["x", "y"])
part = tex.get_part_by_tex("b")
print(tex.index_of_part(part))
## 输出结果
# 3
print(tex.index_of_part_by_tex("b"))
## 输出结果
# 3
在分成的6个部分中,\(b\)所在的部分是第4个,index是从0开始的,所以示例中输出结果为3。
之所以要拆分公式,就是为了对不同的部分进行不同的操作,下面的示例样式拆分之后带来的应用。
3.3. 公式着色
使用拆分前,虽然也可以通过color属性给公式着色,但是只能给整个公式设置一个颜色:
tex = MathTex(
"z=\sqrt{x^2+y^2}",
color=RED,
)
拆分之后,可以通过set_color_by_tex给不同的部分设置不同的颜色:
tex = MathTex("z", "=", "\sqrt{x^2+y^2}",
substrings_to_isolate=["x", "y", "z"])
tex.set_color_by_tex("x", RED)
tex.set_color_by_tex("y", GREEN)
tex.set_color_by_tex("z", BLUE)
同时设置多个颜色,也可以用set_color_by_tex_to_color_map方法:
tex.set_color_by_tex_to_color_map({
"x": BLUE, "y": RED, "z": GREEN
})
上面三种方式着色后的效果如下:
3.4. 透明度设置
除了颜色,拆分之后,也可以给不同的部分设置透明度。
tex = MathTex(
"z",
"=",
"\sqrt{x^2+y^2}",
substrings_to_isolate=["x", "y", "z"],
)
tex.set_opacity_by_tex("x", 0.4)
tex.set_opacity_by_tex("y", 0.4)
tex.set_opacity_by_tex("z", 0.6)
tex.set_color_by_tex_to_color_map({
"x": BLUE, "y": RED, "z": GREEN
})
给\(x,y,z\)方别设置的不同的透明度和颜色,和未设置透明度时的对比如下:
3.5. 排序
最后这个是排序功能,是将数学公式的各个部分按照ASCII码的顺序排序。
比如,排序前(正常的公式从左到右的顺序排列各个部分):
tex = MathTex("c>a>b",
substrings_to_isolate=["a", "b", "c"])
for i in range(len(tex)):
print(tex[i])
## 输出结果:
# SingleStringMathTex('c')
# SingleStringMathTex('>')
# SingleStringMathTex('a')
# SingleStringMathTex('>')
# SingleStringMathTex('b')
排序后:
tex.sort_alphabetically()
for i in range(len(tex)):
print(tex[i])
## 输出结果:
# SingleStringMathTex('>')
# SingleStringMathTex('>')
# SingleStringMathTex('a')
# SingleStringMathTex('b')
# SingleStringMathTex('c')
按照ASCII码的顺序重新排列了各个部分。
这样排列有什么用呢?通过动画来显示公式时,渲染的顺序不一样。
排序前,从左到右一次显示c, >, a, >, b;
排序后,显示顺序为变为>, >, a, b, c。
4. 附件
文中完整的代码放在网盘中了(math_tex.py),
下载地址: 完整代码 (访问密码: 6872)
manim边学边做--MathTex的更多相关文章
- 学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 ...
- 牛腩学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的制作过程(含后台接口的制作,放到自己买的阿里云服务器, ...
- 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...
随机推荐
- MindSpore强化学习:使用PPO配合环境HalfCheetah-v2进行训练
本文分享自华为云社区<MindSpore强化学习:使用PPO配合环境HalfCheetah-v2进行训练>,作者: irrational. 半猎豹(Half Cheetah)是一个基于Mu ...
- JUC并发编程学习笔记(二)Lock锁(重点)
Lock锁(重点) 传统的synchronized 传统的解决多线程并发导致的一些问题我们会使用synchronized关键字来解决,synchronized的本质就是队列.锁. Lock的实现类有: ...
- ZJC比赛
\(\large{Uptatete}\) 先放张图 这次是真的没想再改了,但是一到教室就又会怎么优化了 没必要每个点都让它和其他所有点判断一下,可以从上一个点加加减减啥的转过来 然后我就在昨天那个 \ ...
- 圈子社交系统--在线了解前后端,APP小程序H5,三端源码交付-多重玩法,新奇有趣。
圈子论坛社区系统,含完整的后台PHP系统.功能:小程序授权登陆,H5和APP,手机号登陆,发帖,建圈子.发活动.圈主可置顶推荐帖子,关注.点赞.评论.交流等.可作为圈子贴吧等自媒体. 一款全开源支持免 ...
- 19、python 脚本
1.python 安装及配置 下载地址 python2 和 python3 共存安装 2.python 可视化 import turtle turtle.pensize(2) #画一个小圆 turtl ...
- Pytorch param.grad.data. 出现 AttributeError: ‘NoneType‘ object has no attribute ‘data‘
程序中有需要优化的参数未参与前向传播.
- phpstudy8.1安装与配置
环境: window10 phpstudy8.1.1.3 Vmware安装centos7.6 使用场景 window10安装mysql和redis 在Vmware安装centos7.6 桥接模式上网 ...
- golang url解析
package main import "fmt" import "net/url" import "strings" func main( ...
- AIRIOT答疑第1期 | 零开发基础也能干物联网平台项目?
当然可以! 物联网低代码平台以零门槛.部署快.灵活性高.满足二次开发等特点,成为近两年来IOT服务的生力军.项目团队即使没有研发人员,也可以像拼乐高一样快速搭建物联网平台,功能全面,满足多数业务场景下 ...
- 如何利用 Seaborn 实现高级统计图表
本文分享自华为云社区<使用 Seaborn 实现高级统计图表从箱线图到多变量关系探索> ,作者:柠檬味拥抱. 在数据科学和数据可视化领域,Seaborn 是一个备受欢迎的 Python 可 ...