用manim实现有想法的Pi

news2024/11/18 16:48:18

 

这幅图展示了一个关于矩阵乘法的数学公式,背景为深绿色,给人一种简洁而专业的感觉。图中间是一个矩阵乘法的表达式,左侧是两个 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.coloradmin.cn/o/2177812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows:win11旗舰版连接无线显示器,连接失败

摘要:win11系统通过 miracast 无线连接到长虹电视的时候,一直连接不上。查看电脑又是支持 miracast 协议,后续发现关闭防火墙即可正常连接。 一、问题现状 最近公司里新换了电视,打算把笔记本电脑投屏到电视上。由于 HDMI 插拔不…

电子信息工程职称评审流程有哪些?

电子信息工程职称评审流程有哪些? 2024年工程类职称评审6大步骤: 1.确认申报条件 2.准备评审材料 3.提交评审材料 4.组织专家评审 5.进入答辩环节 6.职称公示下证 哪些人可以评电子信息工程呢? 从事微电子、计算机与网络、信息与通信、…

媒体发稿:怎样写下有吸引力的文案共享-华媒舍

媒体发稿推广已成为企业、机构和个人宣传策划的重要方式之一。因为市场竞争激烈,怎样写下有吸引力的爆款文案成为了一个重要环节。这篇科谱详细介绍文章内容将为您分享一些对于如何写下爆款文案的机密手册。 1、关键词的风采 题目是文案的店面,取决于读…

头戴式耳机性价比排名有哪些?五大头戴式耳机排名推荐!

现在头戴式耳机凭借其优良的音质、舒适的佩戴体验和出色的隔音效果,成为了众多音乐爱好者和影音娱乐用户的首选。然而,面对市场上众多品牌和型号,如何选择一款性价比高、符合个人需求的耳机,头戴式耳机性价比排名有哪些&#xff1…

Android OpenGLES2.0开发(三):绘制一个三角形

我们总是对陌生人太客气,而对亲密的人太苛刻 上一篇文章中,我们已经将OpenGL ES环境搭建完成。接下来我们就可以开始我们的绘图之旅了。该篇我们讲解最基本图形三角形的绘制,这是一切绘制的基础。在OpenGL ES的世界里一切图形都可以由三角形拼…

Linux云计算 |【第四阶段】RDBMS1-DAY5

主要内容: 试图概述(创建视图VIEW、修改、查看、删除)、变量(全局变量、会话变量、用户变量、局部变量)、存储过程(创建、调用、删除存储过程)、流程控制结构(分支结构:…

必备!8款热门网页制作工具大汇总

在过去,网站的构建主要依赖专业人员手动编写HTML、CSS和JavaScript等代码。然而,如今涌现出越来越多智能化的网页制作工具,使得任何人都能在零编码基础上轻松创建和设计网站。本文将向您介绍2022年热门的网页制作工具。选择合适的网页制作工具…

【WPF】桌面程序开发之窗口的用户控件详解

使用Visual Studio开发工具,我们可以编写在Windows系统上运行的桌面应用程序。其中,WPF(Windows Presentation Foundation)项目是一种常见的选择。然而,对于初学者来说,WPF项目中xaml页面的布局设计可能是一…

Naive UI 选择器 Select 的:render-label 怎么使用(Vue3 + TS)

项目场景: 在Naive UI 的 选择器 Select组件中 ,如何实现下面的效果 ,在下拉列表中,左边展示色块,右边展示文字。 Naive UI 的官网中提到过这个实现方法,有一个render-label的api,即&#xff…

Golang | Leetcode Golang题解之第442题数组中重复的数据

题目&#xff1a; 题解&#xff1a; func findDuplicates(nums []int) (ans []int) {for _, x : range nums {if x < 0 {x -x}if nums[x-1] > 0 {nums[x-1] - nums[x-1]} else {ans append(ans, x)}}return }

有通话质量更好的蓝牙耳机推荐吗?高品质的平价开放式耳机推荐

个人认为开放式耳机在通话方面还是表现不错的&#xff0c;主要有以下几个原因&#xff1a; 首先&#xff0c;在麦克风设计与配置方面&#xff1a; 拥有高品质麦克风硬件。优质的开放式耳机往往会配备高性能的麦克风&#xff0c;这些麦克风灵敏度较高&#xff0c;能够精准地捕捉…

1.2.1 HuggingFists安装说明-Linux安装

Linux版安装说明 下载地址 【GitHub】https://github.com/Datayoo/HuggingFists 【百度网盘】https://pan.baidu.com/s/12-qzxARjzRjYFvF8ddUJQQ?pwd2024 安装说明 环境要求 操作系统&#xff1a;CentOS7 硬件环境&#xff1a;至少4核8G&#xff0c;系统使用Containerd…

如何理解矩阵的复数特征值和特征向量?

实数特征值的直观含义非常好理解&#xff0c;它就是在对应的特征向量方向上的纯拉伸/压缩。 而复数特征值&#xff0c;我们可以把它放在复数域中理解。但是这里给出一个不那么简洁、但是更加直观的理解方式&#xff1a;把它放在实空间中。那么复数特征值表现的就是旋转等比放大…

Linux进程间的通信(三)IPC-信号通信和system-V消息队列

目录 信号通信 信号动作的改写 测试 信号的发送 消息队列 消息队列创建要用到的函数 send.c&#xff1a; recv.c 控制消息队列 信号通信 信号通信是一种在 Unix 和类 Unix 系统&#xff08;如 Linux&#xff09;中用于进程间异步通知的机制。信号是一种软件中断&#x…

数据库软题3-专门的集合运算

一、投影&#xff08;筛选列&#xff09; 题1 题2 二、选择(筛选行) 三、连接 3.自然连接 题1-自然连接的属性列数&#xff08;几元关系&#xff09;和元组数 解析&#xff1a; 题2-自然连接的属性列数&#xff08;几元关系&#xff09;和元组数 自然连接后的属性个数 A列…

SpringBoot3+Druid YAML配置

背景 Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生&#xff0c;内置强大的监控功能&#xff0c;监控特性不影响性能。功能强大&#xff0c;能防SQL注入&#xff0c;内置Loging能诊断Hack应用行为。现在已经SpringBoot3&#xff0c;Druid的配置也需要随…

java基础(4)类和对象

目录 1.前言 2.正文 2.1类的定义与使用 2.1.1类的定义 2.1.2类的实例化 2.1.3this引用 2.1.3.1 访问当前对象的成员变量 2.1.3.2调用当前对象的成员方法 2.1.3.3构造函数中的 this 2.1.3.4归纳this 2.2封装 2.2.1封装的定义 2.2.2访问修饰符 2.3static 2.3.1sta…

靠谱的建站公司怎么找?2024高端定制开发建站公司推荐

和所有行业一样&#xff0c;网站建设行业内部现在处于一个鱼龙混杂的状态&#xff0c;大多数的网建企业所做的是与模板网站有关的业务&#xff0c;少部分企业专精于定制高端网站。在低端市场逐渐饱和后&#xff0c;无论什么企业都会有开始进行产品升级的需求&#xff0c;而高端…

刚面试完的前端面试题

今天晚上参加了一场长达40多分钟的技术面。我觉得面试官非常专业&#xff0c;问的问题也都是很棒的&#xff01;自己很多知识都需要学习。所以我决定回想并记录下来。回答不对的地方欢迎大家指正&#xff01; 我自己在小本本上回忆出来的大概就是26道题。后期我会持续更新我学习…

(undone) 阅读 MapReduce 论文笔记

参考&#xff1a;https://pdos.csail.mit.edu/6.824/papers/mapreduce.pdf 摘要&#xff1a;简单介绍了 MapReduce 是在大型分布式系统上工作的 Introduction 的内容总结&#xff1a; 1.介绍背景&#xff1a;为什么我们需要分布式系统&#xff1f;MapReduce 的意义是哪些 2.简…