这幅图展示了一个关于矩阵乘法的数学公式,背景为深绿色,给人一种简洁而专业的感觉。图中间是一个矩阵乘法的表达式,左侧是两个 2×22×2 矩阵,分别为:
右侧则是它们的乘积,结果矩阵为:
整个公式被一个红色的气泡框包围,仿佛在进行思考或提问,增添了趣味性。气泡的设计使得观众的注意力集中在公式上,同时也传达出一种探索和求知的氛围。在图的左下角,有一个卡通化的“π”符号,表情疑惑,眼睛上方有两个问号,似乎在思考这个数学公式的含义。这种设计不仅使得图像更加生动有趣,也引发观众对矩阵乘法的好奇心,鼓励他们深入理解这一数学概念。整体而言,这幅图通过生动的视觉元素和清晰的数学表达,成功地将复杂的数学内容以易于理解的方式呈现出来,适合用于教学或学习材料。
接下来,实现一下该效果。
from manim import *
class PiAnimation01(Scene):
def construct(self):
# 设置背景颜色
self.camera.background_color = "#003311"
# 创建 Pi 字符,以大字体和蓝色显示
pi_symbol = Text("π", font_size=144, color=BLUE, font="MS PGothic")
pi_symbol.move_to(ORIGIN) # 将 Pi 符号移动到原点
# 创建左眼睛
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 * 0.625)
# 将眼睛和眼珠组合成一个组
eyes = VGroup(left_eye, right_eye, left_pupil, right_pupil)
# 创建问号文本并放置在 Pi 符号上方
que = Text("???", font_size=52, color=WHITE, font="Fantasy").next_to(pi_symbol, UP)
# 将 Pi 符号、眼睛和问号组合在一起,并进行平移和缩放
pieye = VGroup(pi_symbol, eyes, que).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.1 * UP + 0.5 * RIGHT)
p0 = Dot().next_to(pi_symbol, 0.1 * 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)) # 变换 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)) # 变换 c1 为 c2
self.wait(0.1)
# 创建云朵形状的轮廓
y0 = Ellipse(width=5, height=4.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=RED, fill_opacity=0, stroke_width=7)
# 获取并集的中心
c_t = u.get_center()
print(c_t)
self.play(FadeIn(u))
#self.play(FadeIn(y0,y1,y3,y4,y5))
# 创建矩阵
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)
matrix_b.move_to(LEFT * 1)
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).next_to(c_t,0.1*UP).shift(0.4*DOWN)
# 添加到场景中
self.play(FadeIn(matrices_group))
#self.add(matrices_group)
运行结果:https://download.csdn.net/download/qq_45449625/89816332https://download.csdn.net/download/qq_45449625/89816332
代码解析:
-
创建云朵形状的轮廓:
- 首先定义了几个椭圆,用于创建云朵的轮廓,每个椭圆都设置了颜色、填充透明度和线条粗细等属性。
- 然后将这些椭圆通过
Union
方法合并成一个图形,代表云朵的轮廓。 - 通过
get_center()
方法获取云朵轮廓的中心点坐标,用于后面放置矩阵的位置。
-
创建矩阵:
- 使用
MathTex
方法创建四个矩阵,分别表示两个相乘的矩阵和相乘结果的矩阵。 - 设置每个矩阵的 LaTeX 公式,用于显示矩阵中的元素。
- 使用
-
设置矩阵位置:
- 使用
move_to
方法将每个矩阵移动到指定的位置,分别在画布的左边和右边。 - 使用
arrange
方法将所有矩阵排列成一行,并使用next_to
方法将它们放在云朵的中心下方。
- 使用
-
动画展示:
- 使用
FadeIn
方法将所有矩阵在动画中淡入显示。
- 使用
代码分析:
- 该代码展示了 Manim 中如何创建和动画化数学图形,如矩阵。
- 通过
Union
方法可以将多个图形合并成一个图形,实现复杂的图形设计。 - 通过
MathTex
方法可以方便地创建包含 LaTeX 公式的文本对象。 - Manim 提供了丰富的动画效果,例如
FadeIn
用于淡入显示。
代码改进建议:
- 可以使用
Create
或FadeInFrom
等方法创建更丰富的动画效果。 - 可以添加一些动画,例如矩阵元素的变换或移动,以更清晰地展示矩阵的相乘过程。
- 可以使用
Write
方法将矩阵元素逐个显示,使动画更加生动。
这段代码是展示如何使用 Manim 库来制作一个动画的示例,您可以根据您的需要修改和扩展代码,以实现更多更复杂的动画效果。
总结:
这段代码是使用Manim库创建一个动画,旨在展示两个2x2矩阵的乘法过程。代码分为几个部分:
首先,通过定义多个椭圆形状,组合成一个类似云朵的轮廓,为整个动画增添背景效果。这些椭圆通过Union
方法合并成一个图形,中心点的位置将用于后续矩阵的放置。接下来,代码用MathTex
创建了两个矩阵和其乘积的数学表达式,并设置每个矩阵的位置,让它们分别位于画布的左侧和右侧。利用move_to
和arrange
函数,矩阵整齐排布,方便进行视觉展示。
动画效果通过FadeIn
方法实现,使得矩阵以淡入的形式呈现。虽然当前实现已经具备基本效果,但可以通过加入更多动画手法(如逐个显示矩阵元素、使用不同的动画效果等)来增强视觉吸引力和教学效果。
总体而言,这段代码展示了如何利用Manim在数学教育中创造生动的可视化效果,帮助观众直观理解矩阵乘法的概念。