manim中的桌面设计和实现转换

news2024/12/24 11:34:11

         在这段代码中,我们实现了一系列富有创意和动态效果的数学表达式展示。这种展示方式不仅能够吸引观众的注意力,还能有效地传达复杂的数学概念。代码主要围绕一个点 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/89823997icon-default.png?t=O83Ahttps://download.csdn.net/download/qq_45449625/89823997

 

 

 

 

         通过调用多种自定义的函数(如 showNewEquationLabida 和 Unla 等),代码实现了灵活多变的表达式展示。这些函数不仅提升了代码的可读性,还增加了表达的丰富性,使得每一个数学符号和公式都具备了其独特的意义。此外,代码的最后一部分使用了 last 函数,完成了整个表达式的最终呈现,进一步加强了整体结构的严谨性。

        总的来说,这段代码展示了如何通过动画的方式将数学内容以生动的形式呈现出来,适合用于教学、演示或是科普类的活动。其核心在于利用动画效果活化抽象的数学概念,增强观众的兴趣和理解,通过一系列连贯的视觉变化,使复杂的数学理论变得更易于接受与掌握。

第一段代码解释:

  1. 导入库

    • from manim import * 导入 Manim 模块,Manim 是一个用于创建数学动画的库。
  2. 类定义 (PiAnimation101)

    • 定义了一个Scene的子类,PiAnimation101,这是一个 Manim 场景,用于创建特定的动画效果。
  3. 方法 showNewEquation

    • 创建并返回一个数学表达式,表示某种线性代数公式,功能是绘制 V × W 的行列式。
  4. 方法 Labida

    • 创建并返回一个表示行列式特征方程的数学表达式。
  5. 方法 Unla

    • 创建两个 2x2 矩阵符号(matrix_a 和 matrix_b)以及它们的等式和结果矩阵。
    • 通过设置位置来控制每个矩阵在场景中的排列。使用VGroup将这些元素组合成一个组,返回一组带有“为什么?”的文本和矩阵表达式的组合。
  6. 方法 longleftrightarrowDet

    • 创建一个视觉表达,包含向量加法、双向箭头和行列式的符号。
    • 通过VGroup组合这些数学元素,为视觉效果提供联系。

整体而言,这段代码的目的是构建数学动画,使用 Manim 库来展示矩阵运算、行列式相关概念、以及将这些内容整合到动画场景中。每个方法都偏重于不同的数学表达式,为最终的动画效果提供基础。

第二段代码解释:

  1. 方法 last

    • 创建了两个 MathTex 对象,分别表示数学符号的 2x2 矩阵 matrix_a 和 matrix_b。这两个矩阵将用于展示矩阵乘法。
    • equals 是一个表示等号的 MathTex 对象。
    • result_matrix 是一个表示矩阵乘法结果的 MathTex 对象。同样是一个 2x2 矩阵,包含了通过矩阵乘法计算出来的各元素。
    • VGroup 将所有的矩阵、等号和结果矩阵组合在一起,并使用 .arrange(RIGHT) 方法使它们水平排列,形成一个整齐的数学表达式。
  2. 方法 construct

    • construct 方法是 Manim 场景中用于构建动画的主方法。在这里调用 self.MovingDet(),这意味着在动画中将执行 MovingDet 方法的内容(该方法的具体实现并未显示在代码中)。

整体而言,这段代码的目的是构建与矩阵乘法相关的数学结构,并将其几个部分组合在一起,以便在 Manim 动画中进行展示。方法 last 创建了必要的数学表达式,而 construct 方法则负责将这些数学结构通过特定动画效果呈现给观众。

第三段代码解释:

  1. 显示点

    • self.play(GrowFromCenter(dot)): 使用 GrowFromCenter 动画效果,从中心放大显示一个点 dot
  2. 转变到中心的数学公式

    • self.play(Transform(dot, Mt)): 将 dot 对象的内容转变为另一个数学公式 Mt
  3. 等待

    • self.wait(1): 暂停动画 1 秒,以便观众有时间查看当前的动画内容。
  4. 获取并显示新公式

    • 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 秒。
  5. 显示 Lambida 的数学表达式

    • AL = self.Labida().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN): 调用 Labida 函数,获取另一个数学表达式,并设置相对位置。
    • self.play(Transform(dot, AL)): 将 dot 转变为 AL 表达式。
  6. 显示黄色的双箭头

    • aab = self.Unla().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN): 调用 Unla 函数,获取双箭头的表达式。
    • self.play(Transform(dot, aab)): 将 dot 的内容替换为双箭头。
  7. 显示公式

    • aa00 = self.longleftrightarrowDet().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN): 调用 longleftrightarrowDet 函数,获取另一个公式。
    • self.play(Transform(dot, aa00)): 将 dot 的内容替换为该公式。
  8. 调用 last 函数

    • lastM = self.last().next_to(c_t, 0.2 * UP).shift(0.4 * DOWN): 使用 last 方法获取最后的数学表达式组合。
    • self.play(Transform(dot, lastM)): 用 lastM 替换 dot 的内容。
  9. 等待结束

    • self.wait(1): 最后暂停 1 秒,让观众能够看到最后的结果。

整体而言,这段代码展示了一系列的数学表达式,通过动画效果逐步替换 dot 的内容,形成了一种连贯的视觉展示,适用于数学主题的动画教学。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181271.html

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

相关文章

JUC高并发编程5:多线程锁

1 锁的八个问题演示 标准访问,先打印短信还是邮件 class Phone{public synchronized void sendSMS() throws InterruptedException {System.out.println("----------sendSMS");}public synchronized void sendEmail(){System.out.println("-------…

AndroidStudio导入so文件

点击app 右键依次选择New-Floder-JNI Floder 创建jni目录 将需要的so文件拷贝到jni目录 在app目录下,build.gradle文件的android{}中添加: sourceSets {main{jniLibs.srcDirs [src/main/jni]}}点击一下Sync Project with Gradle Files 然后编译生成AP…

第7届医联赛圆满举行,鱼跃医疗连续6年保障赛事安全

9月22日-26日,第7届医联赛戈壁群英会在甘肃瓜州举行,来自全国各地的3000名医药行业企业家代表齐聚一堂,开启为期3天的身心极限挑战——徒步穿越81公里的戈壁滩。鱼跃医疗连续6年全程保障参赛者的生命安全,助力赛事圆满完成。 鱼跃…

大模型初学者指南:笔记本电脑上用 ollama 运行大模型!

之前国外有一初学者小哥在Google Colab(A100 40G)利用DPO微调Mistral 7B,微调后的模型在基准测试中取得不错的成绩,从那时起,我觉得在笔记本电脑上运行/微调大模型并非遥不可及的。 对于初学者而言,如果能…

[论文精读]Multi-Channel Graph Neural Network for Entity Alignment

论文网址:Multi-Channel Graph Neural Network for Entity Alignment (aclanthology.org) 论文代码:https:// github.com/thunlp/MuGNN 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&a…

插上网线无法连接网络,控制面板以太网消失 | 如何重装网络驱动

如果你确定你的网线没问题,网线插口没问题,那你大概率就是驱动问题,可以试一下本方法。 0 以太网消失 事情是这样的,我工作时候需要接内网,插网线,摸鱼时候连外网,我就把网线关了。 每次插网线…

飞致云开源社区月度动态报告(2024年9月)

自2023年6月起,中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营…

STM32F1+HAL库+FreeTOTS学习13——二值信号量

STM32F1HAL库FreeTOTS学习13——二值信号量 1. 信号量2. 二值信号量3. 相关API函数3.1 创建二值信号量3.2 获取信号量3.3 释放信号量3.4 删除信号量 4. 二值信号量操作实验1. 实验内容2. 代码实现:3. 运行结果 上一期我们学习了FreeRTOS中的队列,这一期我…

【Linux探索学习】第二弹——Linux的基础指令(中)——夯实基础第二篇

Linux基础指令(上):【Linux探索学习】第一弹——Linux的基本指令(上)——开启Linux学习第一篇-CSDN博客 前言: 在前面我们已经讲解了一些常用的Linux的基础指令,那些当然是远远不够的&#xff…

舵机在无人机中的应用

一、舵机工作原理 舵机是一种位置(角度)伺服的驱动器,由电子控制与机械控制部分组成。当控制信号输入时,电子控制部分会根据控制器的指令调节直流电机输出的旋转角度和速度,由机械部分转化为控制面的位移以及相应的角…

基于SpringBoot+Vue的个人健康管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

基于Python可视化的学习系统的设计与实现(源码+文档+调试+答疑)

文章目录 一、项目介绍二、视频展示三、开发环境四、系统展示五、代码展示六、项目文档展示七、项目总结 大家可以帮忙点赞、收藏、关注、评论啦 👇🏻 一、项目介绍 随着计算机技术发展,计算机系统的应用已延伸到社会的各个领域&#xff0c…

小程序原生-利用setData()对不同类型的数据进行增删改

1. 声明和绑定数据 wxml文件 <view> {{school}} </view> <view>{{obj.name}}</view> <view id"{{id}}" > 绑定属性值 </view> <checkbox checked"{{isChecked}}"/> <!--算数运算--> <view>{{ id …

TS系列(7):知识点汇总

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 一、TS是什么&#xff1f; TypeScript 由微软开发&#xff0c;是基于 JavaScript 的一个扩展语言。TypeScript 包含 JavaScript 的所有内容&#xff0c;是 JavaScript 的超集。TypeScript 增加了静态类型检…

基于SSM的宠物领养管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的宠物领养管理系统2拥有两种角色 管理员&#xff1a;宠物分类管理、领养管理、宠物商品管理、用户管理、寄存管理、丢失信息管理、订单管理等 用户&#xff1a;登录注册、收藏评…

算法:LCR 173. 点名 (原:剑指 offer:0~n-1 中缺失的数字 )

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;一题多解&#xff09; 思路一&#xff1a;高斯求和公式 利用高斯求和公式求出0~n的和&#xff0c;然后减去nums数组中的每一个数&#xff0c;最后的结果就是缺失的数字 时间复杂度&#xff0c;O(N) 过于简单&#xff…

nginx:反向代理服务器——一个非常强大且灵活的工具

Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;常用于 Web 服务器、负载均衡器和反向代理。它以其高性能、稳定性、丰富的功能集、简单的配置文件和低资源消耗而著称。在部署 Web 应用程序时&#xff0c;Nginx 常被用来处理静态文件、反向代理动态内容、负载均衡等任…

AI大模型面试大纲

大纲 1. 介绍和背景 自我介绍&#xff08;5分钟&#xff09; 了解候选人的教育背景、工作经历和对大模型架构的兴趣。 2. 基础理论和概念&#xff08;30分钟&#xff09; 机器学习基础 解释基本概念&#xff0c;如监督学习、无监督学习和强化学习。 讨论不同的模型类型&#xf…

UG NX二次开发(C#)-建模-根据拉伸体获取草图对象

文章目录 1、前言2、在UG NX中创建基于草图的拉伸对象2.1 在建模模块中进入草图环境2.2 创建拉伸特征2.3 分析拉伸特征父项3 实现代码3.1 基于NXOpen实现3.2 UFun函数实现3.3 效果1、前言 今天在QQ群中,有个群友咨询了根据拉伸体获取草图对象,我今天难得清闲一次,就讲一下吧…

JQuery基本介绍和使用方法

JQuery基本介绍和使用方法 W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: ⽹⻚内容⽹⻚结构⽹⻚样式 但是原⽣的JavaScript提供的API操作DOM元素时, 代码⽐较繁琐, 冗⻓. 我们可以使⽤JQuery来操作⻚⾯对象. jQuery是⼀个快速、简洁且功能丰富的JavaScript框架, 于20…