视频展示
代码展示
from manim improt*
class Liujian(Scene):
def construct(self):
tex_template = TexTemplate()
tex_template.add_to_preamble(r"\usepackage{ctex}") # 添加 ctex 模板
# 题目
text_1 = Tex(r"高斯积分", tex_template=tex_template, font_size=120, color=BLUE_B)
self.play(Write(text_1))
self.wait(1)
# 平移并显示新的公式
text_2 = Tex(r"$\int^{\infty}_0 e^{-x^2} dx$", tex_template=tex_template, font_size=90, color=RED_A)
self.play(text_1.animate.shift(LEFT * 2.25).scale(3 / 4), Write(text_2.move_to([2, 0, 0])))
self.wait(1)
self.play(FadeOut(text_1), text_2.animate.move_to(ORIGIN).scale(1.5))
# 进行下一步的公式转换
text_3 = Tex(r"$I^{2} = \int_{0}^{\infty} e^{-x^{2}} dx \cdot \int_{0}^{\infty} e^{-x^{2}} dx$",
tex_template=tex_template, font_size=90, color=RED_A)
self.play(text_2.animate.move_to([0, 2, 0]))
self.wait(0.5)
self.play(Write(text_3))
# 使用 ReplacementTransform 进行转换
text_4 = Tex(r"$I^{2} = \int_{0}^{\infty} e^{-x^{2}} dx \int_{0}^{\infty} e^{-y^{2}} dy$",
font_size=90, color=RED_A)
self.play(FadeOut(text_2),ReplacementTransform(text_3, text_4))
self.wait(0.5)
text_5 = Tex(r"$I^2 = \int_{0}^{\infty} e^{-(x^{2}+y^{2})} dx dy$", font_size=90, color=BLUE_B)
self.play(ReplacementTransform(text_4, text_5))
self.wait(0.8)
text_6 = Tex(r"换元 $x = tcos({\alpha}),y=tsin({\alpha})$",tex_template=tex_template, font_size=90, color=BLUE_B).move_to([0, 2, 0])
self.play(Write(text_6))
self.wait(0.5)
text_7 = Tex(r"""$I^{2}=\int_{0}^{2 \pi}\int_{0}^{\infty} e^{-\left(x^{2}+y^{2}\right)}\begin{vmatrix}
\frac{\mathrm{d}x}{\mathrm{d}\alpha }{} & \frac{\mathrm{d}x}{\mathrm{d}t }{}\\
\frac{\mathrm{d}y}{\mathrm{d}\alpha }{}&\frac{\mathrm{d}y}{\mathrm{d}t }{}
\end{vmatrix} d {\alpha}d t$""",tex_template=tex_template, font_size=90, color=BLUE_B).scale(0.75)
self.play(FadeOut(text_6),ReplacementTransform(text_5,text_7))
self.wait(0.5)
text_8 = Tex(r"""$I^2 = \int_0^{2\pi}\int_0^{\infty}e^{-t^2}{}t d\alpha dt$""",tex_template=tex_template, font_size=90, color=BLUE_B)
self.play(ReplacementTransform(text_7,text_8))
self.wait(0.5)
text_9 = Tex(r"""$I^2 = 2\pi \int_0^{\infty}e^{-t^2}{}t dt$""",tex_template=tex_template, font_size=90, color=BLUE_B)
self.play(ReplacementTransform(text_8,text_9))
self.wait(0.5)
text_10 = Tex(r"""$I^2 = 2\pi \int_0^{\infty}e^{-t^2}{}d{\frac{1}{2}t^{2}}$""",tex_template=tex_template, font_size=90, color=BLUE_B)
self.play(ReplacementTransform(text_9,text_10))
self.wait(0.5)
text_11 = Tex(r"""$I^2 = \pi \int_0^{\infty}e^{-t^2}{}dt^{2}$""",tex_template=tex_template, font_size=90, color=BLUE_B)
self.play(ReplacementTransform(text_10,text_11))
self.wait(0.5)
text_12 = Tex(r"""$ I^2 = -\pi e^{-t^2}\bigg|_0^{\infty}$""",tex_template=tex_template, font_size=90, color=BLUE_B)
self.play(ReplacementTransform(text_11,text_12))
self.wait(0.5)
text_13 = Tex(r"""$I^2 = \pi$""",tex_template=tex_template, font_size=90, color=BLUE_B)
self.play(ReplacementTransform(text_12,text_13))
self.wait(0.5)
text_14 = Tex(r"""$I = \sqrt{\pi}$""",tex_template=tex_template, font_size=130, color=YELLOW_B)
self.play(ReplacementTransform(text_13,text_14))
self.wait(1)
%manim -pqh Liujian</pre>
上面是我写的屎山代码,命名方式和代码规则都是很不规范了。上面的积分区间结果是$-\infty$到$\infty$的,这里我弄错误了
下面是ai修改之后,整体结构更加的舒适了
class Liujian(Scene):
def construct(self):
tex_template = TexTemplate()
tex_template.add_to_preamble(r"\usepackage{ctex}") # 添加 ctex 模板
# 1. 显示标题
text_1 = Tex(r"高斯积分", tex_template=tex_template, font_size=120, color=BLUE_B)
self.play(Write(text_1))
self.wait(1)
# 2. 显示积分公式并调整位置
text_2 = Tex(r"$\int^{\infty}_0 e^{-x^2} dx$", tex_template=tex_template, font_size=90, color=RED_A)
self.play(text_1.animate.shift(LEFT * 2.25).scale(3 / 4), Write(text_2.move_to([2, 0, 0])))
self.wait(1)
self.play(FadeOut(text_1), text_2.animate.move_to(ORIGIN).scale(1.5))
# 3. 逐步转换公式
formula_steps = [
r"$I^{2} = \int_{\infty}^{\infty} e^{-x^{2}} dx \cdot \int_{0}^{\infty} e^{-x^{2}} dx$",
r"$I^{2} = \int_{\infty}^{\infty} e^{-x^{2}} dx \int_{0}^{\infty} e^{-y^{2}} dy$",
r"$I^2 = \int_{\infty}^{\infty} e^{-(x^{2}+y^{2})} dx dy$",
r"换元 $x = t \cos(\alpha), y = t \sin(\alpha)$",
r"""$I^{2}=\int_{\infty}^{2 \pi}\int_{0}^{\infty} e^{-\left(x^{2}+y^{2}\right)}
\begin{vmatrix}
\frac{\mathrm{d}x}{\mathrm{d}\alpha} & \frac{\mathrm{d}x}{\mathrm{d}t} \\
\frac{\mathrm{d}y}{\mathrm{d}\alpha} & \frac{\mathrm{d}y}{\mathrm{d}t}
\end{vmatrix} d \alpha dt$""",
r"$I^2 = \int_0^{2\pi}\int_0^{\infty}e^{-t^2} t d\alpha dt$",
r"$I^2 = 2\pi \int_0^{\infty}e^{-t^2} t dt$",
r"$I^2 = 2\pi \int_0^{\infty}e^{-t^2} d\left(\frac{1}{2}t^{2}\right)$",
r"$I^2 = \pi \int_0^{\infty} e^{-t^2} dt^{2}$",
r"$I^2 = -\pi e^{-t^2} \bigg|_0^{\infty}$",
r"$I^2 = \pi$",
r"$I = \sqrt{\pi}$"
]
# 4. 使用 ReplacementTransform 逐步替换公式
text_current = text_2 # 起始公式
for formula in formula_steps:
text_next = Tex(formula, tex_template=tex_template, font_size=90, color=BLUE_B).scale(0.75)
self.play(ReplacementTransform(text_current, text_next))
self.wait(0.5)
text_current = text_next # 更新当前公式
%manim -pqh Liujian</pre>
本次使用到了指令有,如下几个:
文本对象创建
Tex
:用于创建基于 LaTeX 排版的文本对象,适合显示数学公式和带中文的文本。
- 主要参数:
tex_template=tex_template
:应用前面定义的自定义模板。使用 tex_template
参数可以添加对中文支持的模板。
font_size=<number>
:控制文本的字体大小。例如 font_size=120
表示文本大小为 120。
color=<Color>
:设置文本颜色。Manim 内置了一些颜色(例如 BLUE_B
、RED_A
等),也可以使用 RGB 值定义颜色。
- 示例:text_1 = Tex(r”高斯积分”, tex_template=tex_template, font_size=120, color=BLUE_B)
动画指令
Write
:让文本在屏幕上逐渐显现出来。
- 适用对象:任何
Mobject
对象(如 Tex
文本对象)。
- 参数:直接传入需要显示的对象。
- 示例:self.play(Write(text_1))
FadeOut
:使对象从视图中淡出,逐渐消失。
- 适用对象:任何
Mobject
对象。
- 参数:直接传入需要淡出的对象。
- 示例:self.play(FadeOut(text_1))
ReplacementTransform
:将一个对象平滑替换为另一个对象,适合用于公式推导过程的动画切换。
- 适用对象:任何
Mobject
对象,可以是 Tex
文本或其他图形对象。
- 参数:
- 第一个参数为要替换的对象。
- 第二个参数为替换后的对象。
- 示例:self.play(ReplacementTransform(text_3, text_4))
animate.shift()
:移动对象的位置。常用于将对象移动到新的位置,以便展示新内容。
- 适用对象:任何
Mobject
对象。
- 参数:直接指定平移的方向和距离,通常用向量表示。例如
LEFT * 2.25
表示向左移动 2.25 个单位。
- 示例:self.play(text_1.animate.shift(LEFT * 2.25))
scale()
:缩放对象的大小。
- 适用对象:任何
Mobject
对象。
- 参数:传入缩放比例。例如
scale(1.5)
表示放大 1.5 倍,scale(3 / 4)
表示缩小至 3/4 大小。
- 示例:self.play(text_1.animate.scale(3 / 4))
move_to()
:将对象移动到特定位置。
- 适用对象:任何
Mobject
对象。
- 参数:传入坐标,例如
[2, 0, 0]
表示移动到坐标 (2, 0, 0)
。
- 示例:self.play(text_2.move_to([2, 0, 0]))
网站显示问题:
最后再说一下,由于网站嵌入的这段代码,所以代码中的文本都是直接给渲染成了公式
<script>
MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$', '$$'], ['\\[', '\\]']],
processEscapes: true
},
svg: {
fontCache: 'global'
}
};
</script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-svg.js"></script>