前言
对于manim
这个第三方模块我就是久仰大名,他是3b1b视频创作者开源的一款,具有独特风格的python
第三方库,可以创作独特的数学视频,本人也是对这类视频风格很是偏爱,后续也是准备考研,准备在备考期间,每天分享一道考研题目,就是为了记录考研期间的枯燥生活,也是为自己的知识体系做一个可视化参照。
案例分析
代码展示
class Chi(Scene):
def construct(self):
tex_template = TexTemplate()
tex_template.add_to_preamble(r"\usepackage{ctex}") # 在模板中添加 ctex
# 使用自定义模板渲染中文
tex = Tex(r"""
已知函数 $ f(x)=\ln \frac{x}{2-x}+a x+b(x-1)^{3} $。""", tex_template=tex_template, font_size=50,color = RED_D)
# 问题部分
question_tex_1 = Tex(r"""(1) 若 $ b=0 $,且 $ f^{\prime}(x) \geqslant 0 $,求 $ a $ 的最小值;"""
,tex_template=tex_template, font_size=40,color = RED_D)
question_tex_2 = Tex(r"""(2) 证明:曲线 $ y=f(x) $ 是中心对称图形;"""
,tex_template=tex_template, font_size=40,color = RED_D)
question_tex_3 = Tex(r"""(3) 若 $ f(x) > -2 $ 当且仅当 $ 1 < x < 2 $,求 $ b $
的取值范围。"""
,tex_template=tex_template, font_size=40,color = RED_D)
# 组合
self.play(Write(tex))
self.wait(1)
self.play(tex.animate.shift(UP*3))
conditions = VGroup(question_tex_1, question_tex_2, question_tex_3).arrange(DOWN, aligned_edge=LEFT, buff=0.5)
conditions.next_to(tex, DOWN, aligned_edge=LEFT) # 将条件放在公式下方,左对齐
# 可选项:若需要,可以逐个显示每个条件,增加可读性
for condition in conditions:
self.play(Write(condition))
self.wait(1)
# 将所有的模块选中再进行平移命令
all_tex = VGroup(tex,conditions)
self.play(all_tex.animate.shift(LEFT*4).scale(0.5),)
self.wait(1)
%manim -pqh Chi</pre>
我是在jupyter
环境上面运行了,除了运行指令以外其余指令都是一模一样的,在PyCharm里面的运行命令是manim -pql python文件.py 类名
代码分析
tex_template = TexTemplate()
tex_template.add_to_preamble(r"\usepackage{ctex}") # 在模板中添加 ctex</pre>
- 在这段代码里面是为了导入latex的
ctex
这个模块他是支持latex中文显示,对于本地安转的中文字体库的朋友,可以选着直接使用Text
这个指令他是支持直接显示中文的,对于我(在云服务器上面安转运行了)或者本地没有安装本地字体的可以选着使用Tex
这段代码的主要功能就是实现的对问题文字的展示,其中Tex
和VGroug
这两个指令最为重要。首先Tex
支持中文和公式同时渲染,对于展示数学问题,极为了友好,而前面提到了Text
这个指令,它仅仅支持对于文字的渲染,不能同时渲染公式。
# 使用自定义模板渲染中文
tex = Tex(r"""
已知函数 $ f(x)=\ln \frac{x}{2-x}+a x+b(x-1)^{3} $。""", tex_template=tex_template, font_size=50,color = RED_D)
# 问题部分
question_tex_1 = Tex(r"""(1) 若 $ b=0 $,且 $ f^{\prime}(x) \geqslant 0 $,求 $ a $ 的最小值;"""
,tex_template=tex_template, font_size=40,color = RED_D)
question_tex_2 = Tex(r"""(2) 证明:曲线 $ y=f(x) $ 是中心对称图形;"""
,tex_template=tex_template, font_size=40,color = RED_D)
question_tex_3 = Tex(r"""(3) 若 $ f(x) > -2 $ 当且仅当 $ 1 < x < 2 $,求 $ b $
的取值范围。"""
,tex_template=tex_template, font_size=40,color = RED_D)
# 组合
self.play(Write(tex))
self.wait(1)
self.play(tex.animate.shift(UP*3))
conditions = VGroup(question_tex_1, question_tex_2, question_tex_3).arrange(DOWN, aligned_edge=LEFT, buff=0.5)
conditions.next_to(tex, DOWN, aligned_edge=LEFT) # 将条件放在公式下方,左对齐
# 可选项:若需要,可以逐个显示每个条件,增加可读性
for condition in conditions:
self.play(Write(condition))
self.wait(1)</pre>
这段代码的主要功能就是实现的对问题文字的展示,其中Tex
和VGroug
这两个指令最为重要。首先Tex
支持中文和公式同时渲染,对于展示数学问题,极为了友好,而前面提到了Text
这个指令,它仅仅支持对于文字的渲染,不能同时渲染公式。
VGroug
这个指令的作用是进行组合,把question_tex_num
全部组合在一起
.arrange(DOWN, aligned_edge=LEFT, buff=0.5)
这个指令的目的是让组合方式是向下的,行间距是0.5。展示效果类似于一行一行的对齐
.next_to(tex, DOWN, aligned_edge=LEFT)
这个命令的目的是让组合移动到问题的下发,对齐方式还是左对齐。
for condition in conditions:
self.play(Write(condition))
self.wait(1)
这段代码实现的效果和目的:把组合物一行一行的方式展示出来,更美观也是更直观
3.最后一段代码:
all_tex = VGroup(tex,conditions)
self.play(all_tex.animate.shift(LEFT*4).scale(0.5),)
self.wait(1)
再一次使用VGoup
这个指令把全部问题组合成一个整体,再进行.animate.shift(LEFT*4).scale(0.5)
指令进行平移间的缩放,展示效果如视频的最后一个阶段相似
最后总结
本次使用指令:
1.
tex_template = TexTemplate()
tex_template.add_to_preamble(r"\usepackage{ctex}") # 在模板中添加 ctex
2.
Tex() #传入latex语法,支持显示中文,也支持中文和公式一起显示
3.VGroup
,组合命令
4.all_tex.animate.shift(LEFT*4).scale(0.5)
对于组合类的平移缩放效果展示