在这段代码中,我们实现了一系列富有创意和动态效果的数学表达式展示。这种展示方式不仅能够吸引观众的注意力,还能有效地传达复杂的数学概念。代码主要围绕一个点 dot
展开,它逐步转变为不同的数学公式和符号,每个转变过程都伴随着精心设计的动画效果,增强了视觉效果和趣味性。
首先,代码开始时通过 GrowFromCenter
动画效果展示起始点 dot
,让观众快速关注这个关键对象。随后,通过 Transform
动作,将这个点的内容逐步替换为多个数学表达式,包括新的公式、Lambida 表达式、黄色双箭头以及最终的公式,这一系列替换过程整齐且流畅。每一次转换都设计了 1 秒的等待时间,确保观众能够充分理解每个表达式的内涵。
from manim import * # 导入 Manim 库,提供用于创建动画的功能
class PiAnimation101(Scene): # 创建一个新的场景类,名为 PiAnimation101
def showNewEquation(self):
# 创建新的公式 V × W = Det(i, j, k; u1, u2, u3; w1, w2, w3),返回一个数学表达式对象
return MathTex(r"V \times W = \text{Det}\begin{pmatrix}i & j & k \\ u_{1} & u_{2} & u_{3} \\ w_{1} & w_{2} & w_{3} \end{pmatrix}")
def Labida(self):
# 返回另一个数学表达式 Det(A - λI) = 0,可能用于特征值问题
return MathTex(r"Det(A-\lambda I)=0")
def Unla(self):
# 创建多个矩阵以展示矩阵运算
matrix_a = MathTex(r"\begin{bmatrix} a & b \\ c & d \end{bmatrix}")
matrix_b = MathTex(r"\begin{bmatrix} e & f \\ g & h \end{bmatrix}")
equals = MathTex("= ")
result_matrix = MathTex(r"\begin{bmatrix} ae + bg & af + bh \\ ce + dg & cf + dh \end{bmatrix}")
# 设置每个矩阵的位置
matrix_a.move_to(LEFT * 3) # 矩阵 A 向左移动
matrix_b.move_to(LEFT * 1) # 矩阵 B 向左移动
equals.move_to(ORIGIN) # 等号放在原点位置
result_matrix.move_to(RIGHT * 2) # 结果矩阵向右移动
# 将所有元素组合成一个组
matrices_group = VGroup(matrix_a, matrix_b, equals, result_matrix).arrange(RIGHT, buff=0.1)
tUn = Text("为什么?") # 创建一个文本对象,内容为“为什么?”
mmb = VGroup(tUn, matrices_group).arrange(DOWN, buff=0.4) # 将文本和矩阵组相结合,并垂直排列
return mmb # 返回组合后的组
def longleftrightarrowDet(self):
# 创建一个包含向量加法和行列式的表达式
a10 = MathTex(r"\vec{v} +\vec{w}") # 向量 v 和 w 的表达式
a11 = MathTex(r"\longleftrightarrow ", stroke_width=6).set_color(YELLOW) # 双箭头设置颜色和宽度
a12 = Text("?").next_to(a11, UP) # 在箭头上方放置一个问号
a30 = MathTex(r"Det") # 行列式的表达式
# 将以上元素组合在一起,水平排列
b0 = VGroup(a10, a11, a30).arrange(RIGHT, buff=0.1)
b1 = VGroup(b0, a12) # 将上面的组合与问号结合在一起
return b1 # 返回最终的组合
def last(self):
# 创建两个矩阵 A 和 B,分别表示为 MathTex 对象
matrix_a = MathTex(r"\begin{bmatrix} a & b \\ c & d \end{bmatrix}")
matrix_b = MathTex(r"\begin{bmatrix} e & f \\ g & h \end{bmatrix}")
equals = MathTex("= ") # 创建一个等号的 MathTex 对象
result_matrix = MathTex(r"\begin{bmatrix} ae + bg & af + bh \\ ce + dg & cf + dh \end{bmatrix}")
# 创建结果矩阵的 MathTex 对象。表示矩阵 A 和 B 的乘积
# 创建一个组合体,将所有的矩阵和等号放在一起,并排放置
return VGroup(matrix_a, equals, matrix_b, result_matrix).arrange(RIGHT)
def construct(self):
# 调用 MovingDet 方法,构建动画内容
self.MovingDet()
def construct(self):
self.camera.background_color = "#003311"
# 创建 Pi 字符
pi_symbol = Text("π", font_size=150, color=BLUE,font="MS PGothic")
pi_symbol.move_to(ORIGIN)
dot = Dot(ORIGIN+0.05*LEFT)
dot2 = Dot(ORIGIN+0.09*RIGHT)
line = Line(dot.get_center(), dot2.get_center(),stroke_width=6).set_color(BLACK).shift(0.49*UP+0.1*RIGHT).rotate(-PI/19)
#liM=Line([ORIGIN+0.2*LEFT,ORIGIN+0.2*RIGHT])
# 创建眼睛
left_eye = Ellipse(width=0.4, height=0.25, color=WHITE,fill_opacity=1).shift(LEFT * 0.15+ UP* 0.625 ).rotate(PI/13)
right_eye = Ellipse(width=0.4, height=0.25, color=WHITE,fill_opacity=1).shift(RIGHT * 0.35 +UP* 0.625).rotate(-PI/13)
#眼珠
left_pupil = Dot(color=BLACK).shift(LEFT * 0.15+ UP* 0.625)
right_pupil = Dot(color=BLACK).shift(RIGHT * 0.35 + UP *UP* 0.625)
#合体
eyes = VGroup(left_eye, right_eye, left_pupil, right_pupil)
que= Text("???", font_size=52, color=WHITE,font="Fantasy").next_to(pi_symbol, UP)
pieye = VGroup(pi_symbol, eyes,que,line).shift(2*DL+LEFT).scale(1.5).shift(2*LEFT)
self.add(pieye)
#加视觉效果
c0=Ellipse(width=0.6, height=0.25, color=WHITE,fill_opacity=0,stroke_width=1).next_to(pi_symbol,0.2*UP+0.5*RIGHT)
p0=Dot().next_to(pi_symbol,UP)
self.play(Transform(p0, c0))
self.wait(0.1)
c1=Ellipse(width=1, height=0.4, color=WHITE,fill_opacity=0,stroke_width=2).next_to(c0,0.1*UP+0.2*RIGHT)
self.play(Transform(c0, c1))
self.wait(0.1)
c2=Ellipse(width=1.6, height=0.62, color=WHITE,fill_opacity=0,stroke_width=3).next_to(c1,0.1*UP+0.2*RIGHT)
self.play(Transform(c1, c2))
self.wait(0.1)
#创建云朵形状的轮廓
y0=Ellipse(width=13, height=5, color=WHITE,fill_opacity=0,stroke_width=3).next_to(c2,0.1*UP+0.1*RIGHT).shift(1*DOWN)
y1=Ellipse(width=10, height=3.5, color=WHITE,fill_opacity=0,stroke_width=3).next_to(c2,0.1*UP+0.1*RIGHT).shift(4*LEFT)
y2=Ellipse(width=9, height=3, color=WHITE,fill_opacity=0,stroke_width=3).next_to(c2,0.1*UP+0.1*RIGHT).shift(4*LEFT).rotate(-PI/13)
y3=Ellipse(width=4, height=3, color=WHITE,fill_opacity=0,stroke_width=3).next_to(c2,0.1*UP+0.1*RIGHT).shift(4.2*LEFT).rotate(PI/2-PI/10)
y4=Ellipse(width=2, height=3, color=WHITE,fill_opacity=0,stroke_width=3).next_to(c2,0.1*UP+4*RIGHT).rotate(PI/4).shift(2.8*RIGHT)
y5=Ellipse(width=2, height=3, color=WHITE,fill_opacity=0,stroke_width=3).next_to(c2,0.1*UP+4*RIGHT).rotate(-PI/4).shift(2.5*RIGHT+0.7*UP)
u = Union(y1, y2,y3, y4,y5,color=WHITE,fill_opacity=0,stroke_width=2)
# 获取并集的中心
c_t = u.get_center()
print(c_t)
#u.next_to(c2,0.1*UP+0.2*RIGHT,buff=0.5)
self.play(Transform(c2,u))
# 初始行列式公式
Mt = MathTex(r"\text{Det}\begin{pmatrix}a & b \\c & d\end{pmatrix} = ad - bc").next_to(c_t,0.2*UP).shift(0.4*DOWN)
dot = Dot().next_to(c_t,0.2*UP).shift(0.4*DOWN)
# 显示点,使用 GrowFromCenter 动画从中心放大显示点
self.play(GrowFromCenter(dot))
# 让数学公式从点的位置移动到中心
self.play(Transform(dot, Mt))
self.wait(1) # 等待 1 秒
# 获取新公式并显示在 c_t 点的上方
xc = self.showNewEquation().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
self.play(Transform(dot, xc)) # 将点的内容替换为新公式
self.wait(1)
# self.play(Write(xc)) # 显示新的公式(注释掉的代码)
# 显示 Lambida 数学表达式
AL = self.Labida().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
self.play(Transform(dot, AL)) # 将点的内容替换为 Lambida
self.wait(1)
# self.play(Write(AL)) # 显示新的公式(注释掉的代码)
# 显示黄色的双箭头
aab = self.Unla().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
self.play(Transform(dot, aab)) # 将点的内容替换为双箭头
self.wait(1)
# 显示公式
aa00 = self.longleftrightarrowDet().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
self.play(Transform(dot, aa00)) # 将点的内容替换为该公式
self.wait(1)
# 其他动画代码...
# 调用 last 函数以获取组合体
lastM = self.last().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
self.play(Transform(dot, lastM)) # 使用 last 函数的输出替换点
self.wait(1) # 等待 1 秒
运行结果:https://download.csdn.net/download/qq_45449625/89823997https://download.csdn.net/download/qq_45449625/89823997
通过调用多种自定义的函数(如 showNewEquation
、Labida
和 Unla
等),代码实现了灵活多变的表达式展示。这些函数不仅提升了代码的可读性,还增加了表达的丰富性,使得每一个数学符号和公式都具备了其独特的意义。此外,代码的最后一部分使用了 last
函数,完成了整个表达式的最终呈现,进一步加强了整体结构的严谨性。
总的来说,这段代码展示了如何通过动画的方式将数学内容以生动的形式呈现出来,适合用于教学、演示或是科普类的活动。其核心在于利用动画效果活化抽象的数学概念,增强观众的兴趣和理解,通过一系列连贯的视觉变化,使复杂的数学理论变得更易于接受与掌握。
第一段代码解释:
-
导入库:
from manim import *
导入 Manim 模块,Manim 是一个用于创建数学动画的库。
-
类定义 (
PiAnimation101
):- 定义了一个
Scene
的子类,PiAnimation101
,这是一个 Manim 场景,用于创建特定的动画效果。
- 定义了一个
-
方法
showNewEquation
:- 创建并返回一个数学表达式,表示某种线性代数公式,功能是绘制 V × W 的行列式。
-
方法
Labida
:- 创建并返回一个表示行列式特征方程的数学表达式。
-
方法
Unla
:- 创建两个 2x2 矩阵符号(
matrix_a
和matrix_b
)以及它们的等式和结果矩阵。 - 通过设置位置来控制每个矩阵在场景中的排列。使用
VGroup
将这些元素组合成一个组,返回一组带有“为什么?”的文本和矩阵表达式的组合。
- 创建两个 2x2 矩阵符号(
-
方法
longleftrightarrowDet
:- 创建一个视觉表达,包含向量加法、双向箭头和行列式的符号。
- 通过
VGroup
组合这些数学元素,为视觉效果提供联系。
整体而言,这段代码的目的是构建数学动画,使用 Manim 库来展示矩阵运算、行列式相关概念、以及将这些内容整合到动画场景中。每个方法都偏重于不同的数学表达式,为最终的动画效果提供基础。
第二段代码解释:
-
方法
last
:- 创建了两个
MathTex
对象,分别表示数学符号的 2x2 矩阵matrix_a
和matrix_b
。这两个矩阵将用于展示矩阵乘法。 equals
是一个表示等号的MathTex
对象。result_matrix
是一个表示矩阵乘法结果的MathTex
对象。同样是一个 2x2 矩阵,包含了通过矩阵乘法计算出来的各元素。VGroup
将所有的矩阵、等号和结果矩阵组合在一起,并使用.arrange(RIGHT)
方法使它们水平排列,形成一个整齐的数学表达式。
- 创建了两个
-
方法
construct
:construct
方法是 Manim 场景中用于构建动画的主方法。在这里调用self.MovingDet()
,这意味着在动画中将执行MovingDet
方法的内容(该方法的具体实现并未显示在代码中)。
整体而言,这段代码的目的是构建与矩阵乘法相关的数学结构,并将其几个部分组合在一起,以便在 Manim 动画中进行展示。方法 last
创建了必要的数学表达式,而 construct
方法则负责将这些数学结构通过特定动画效果呈现给观众。
第三段代码解释:
-
显示点:
self.play(GrowFromCenter(dot))
: 使用GrowFromCenter
动画效果,从中心放大显示一个点dot
。
-
转变到中心的数学公式:
self.play(Transform(dot, Mt))
: 将dot
对象的内容转变为另一个数学公式Mt
。
-
等待:
self.wait(1)
: 暂停动画 1 秒,以便观众有时间查看当前的动画内容。
-
获取并显示新公式:
xc = self.showNewEquation().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
: 调用showNewEquation
函数,获取一个新的数学公式,并设置其相对于点c_t
的位置。self.play(Transform(dot, xc))
: 将dot
的内容替换为xc
,即新的公式。self.wait(1)
: 等待 1 秒。
-
显示 Lambida 的数学表达式:
AL = self.Labida().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
: 调用Labida
函数,获取另一个数学表达式,并设置相对位置。self.play(Transform(dot, AL))
: 将dot
转变为AL
表达式。
-
显示黄色的双箭头:
aab = self.Unla().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
: 调用Unla
函数,获取双箭头的表达式。self.play(Transform(dot, aab))
: 将dot
的内容替换为双箭头。
-
显示公式:
aa00 = self.longleftrightarrowDet().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
: 调用longleftrightarrowDet
函数,获取另一个公式。self.play(Transform(dot, aa00))
: 将dot
的内容替换为该公式。
-
调用
last
函数:lastM = self.last().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN)
: 使用last
方法获取最后的数学表达式组合。self.play(Transform(dot, lastM))
: 用lastM
替换dot
的内容。
-
等待结束:
self.wait(1)
: 最后暂停 1 秒,让观众能够看到最后的结果。
整体而言,这段代码展示了一系列的数学表达式,通过动画效果逐步替换 dot
的内容,形成了一种连贯的视觉展示,适用于数学主题的动画教学。