当前位置: 首页 > article >正文

用manim实现有想法的Pi

 

这幅图展示了一个关于矩阵乘法的数学公式,背景为深绿色,给人一种简洁而专业的感觉。图中间是一个矩阵乘法的表达式,左侧是两个 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/89816332icon-default.png?t=O83Ahttps://download.csdn.net/download/qq_45449625/89816332

 

代码解析:

  1. 创建云朵形状的轮廓:

    • 首先定义了几个椭圆,用于创建云朵的轮廓,每个椭圆都设置了颜色、填充透明度和线条粗细等属性。
    • 然后将这些椭圆通过 Union 方法合并成一个图形,代表云朵的轮廓。
    • 通过 get_center() 方法获取云朵轮廓的中心点坐标,用于后面放置矩阵的位置。
  2. 创建矩阵:

    • 使用 MathTex 方法创建四个矩阵,分别表示两个相乘的矩阵和相乘结果的矩阵。
    • 设置每个矩阵的 LaTeX 公式,用于显示矩阵中的元素。
  3. 设置矩阵位置:

    • 使用 move_to 方法将每个矩阵移动到指定的位置,分别在画布的左边和右边。
    • 使用 arrange 方法将所有矩阵排列成一行,并使用 next_to 方法将它们放在云朵的中心下方。
  4. 动画展示:

    • 使用 FadeIn 方法将所有矩阵在动画中淡入显示。

代码分析:

  • 该代码展示了 Manim 中如何创建和动画化数学图形,如矩阵。
  • 通过 Union 方法可以将多个图形合并成一个图形,实现复杂的图形设计。
  • 通过 MathTex 方法可以方便地创建包含 LaTeX 公式的文本对象。
  • Manim 提供了丰富的动画效果,例如 FadeIn 用于淡入显示。

代码改进建议:

  • 可以使用 Create 或 FadeInFrom 等方法创建更丰富的动画效果。
  • 可以添加一些动画,例如矩阵元素的变换或移动,以更清晰地展示矩阵的相乘过程。
  • 可以使用 Write 方法将矩阵元素逐个显示,使动画更加生动。

这段代码是展示如何使用 Manim 库来制作一个动画的示例,您可以根据您的需要修改和扩展代码,以实现更多更复杂的动画效果。

总结:

这段代码是使用Manim库创建一个动画,旨在展示两个2x2矩阵的乘法过程。代码分为几个部分:

       首先,通过定义多个椭圆形状,组合成一个类似云朵的轮廓,为整个动画增添背景效果。这些椭圆通过Union方法合并成一个图形,中心点的位置将用于后续矩阵的放置。接下来,代码用MathTex创建了两个矩阵和其乘积的数学表达式,并设置每个矩阵的位置,让它们分别位于画布的左侧和右侧。利用move_toarrange函数,矩阵整齐排布,方便进行视觉展示。

        动画效果通过FadeIn方法实现,使得矩阵以淡入的形式呈现。虽然当前实现已经具备基本效果,但可以通过加入更多动画手法(如逐个显示矩阵元素、使用不同的动画效果等)来增强视觉吸引力和教学效果。

        总体而言,这段代码展示了如何利用Manim在数学教育中创造生动的可视化效果,帮助观众直观理解矩阵乘法的概念。


http://www.kler.cn/a/325071.html

相关文章:

  • 为何数据库推荐将IPv4地址存储为32位整数而非字符串?
  • 搜维尔科技:SenseGlove触觉反馈手套开箱+场景测试
  • 运维面试题.云计算面试题集锦之二
  • 【ASR技术】WhisperX安装使用
  • 使用 Go 实现将任何网页转化为 PDF
  • vue3点击按钮el-dialog对话框不显示问题
  • 能力成熟度模型集成(CMMI)
  • c# 结构体反射赋值问题 结构体 反射赋值
  • 百度智能体创建:情感领域的创新力量
  • 大模型训练:K8s 环境中数千节点存储最佳实践
  • 车辆零部件检测和分割数据集-车体数据集-yolo格式-yolov5-yolov10可用
  • docker-图形化工具-portainer的使用
  • Vue $router.push打开新窗口
  • 【Linux网络】详解TCP协议(2)
  • 网站建设中常见的网站后台开发语言有哪几种,各自优缺点都是什么?
  • python和pyqt-tools安装位置
  • 【从零开始实现stm32无刷电机FOC】【实践】【7.1/7 硬件设计】
  • 【Golang】关于Go语言字符串转换strconv
  • 《牧神记》PV初体验,玄机科技再塑经典国漫
  • 学习C++的第七天!
  • 新建flask项目,配置入口文件,启动项目
  • OceanBase 一级表分区记录
  • 浅谈虚拟内存(操作系统、Redis)
  • matlab中在一个图上持续画多条曲线的方法
  • Qualitor processVariavel.php 未授权命令注入漏洞复现(CVE-2023-47253)
  • [Redis][持久化][上][RDB]详细讲解