网络编程
位置:首页>> 网络编程>> Python编程>> python manim实现排序算法动画示例

python manim实现排序算法动画示例

作者:ooooooh灰灰  发布时间:2021-11-10 10:41:58 

标签:python,manim,排序算法,动画

什么是 manim

Manim 是一个用于精确编程动画的引擎,专为创建解释性数学视频而设计。

注意,有两个主要版本的 manim。该存储库最初是 3Blue1Brown 的作者的个人项目,目的是为这些视频制作动画,此处提供了视频专用代码。2020 年,一群开发人员将其分叉成现在的社区版,目标是更稳定、更好地测试、更快地响应社区贡献,以及更友好地开始使用。

主要版本如下:

  • 3b1b/manim 【最新版】

  • cairo-backend【旧版】

  • ManimCommunity/manim 【社区版】

冒泡排序介绍

本文就使用 manim 来实现一个冒泡排序的动画,首先来了解下什么是冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

算法步骤

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

  • 针对所有的元素重复以上的步骤,除了最后一个。

  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

初始化元素

比如我们需要排序数组为: [4,2,3,1,5]

首先,需要在 manim 场景上初始化我们的需要排序的所有元素,这里用矩形来表示。

在 manim 中,可以用 Rectangle 来初始化矩形,然后我们通过设置元素不同的高度来表示不同的元素大小。

  • main.py

from manimlib import *
class Test(Scene):
   def construct(self):
       COLOR = [BLUE, GREEN, RED, PINK, ORANGE, MAROON_B, TEAL, PURPLE_B, GREY_BROWN]
       arr = [4,2,3,1,5]
       g = VGroup()
       for i in range(len(arr)):
           r1=Rectangle(width=1,height=arr[i],fill_color=COLOR[i%len(COLOR)],fill_opacity=1)
           t1=Text(str(arr[i])).scale(0.5)
           rec = VGroup(r1,t1)
           g.add(rec)
       g.arrange(RIGHT,aligned_edge=DOWN)
       self.add(g)
       self.wait()

使用下面的命令运行上面的代码:

manimgl main.py BubbleSort

ManimGL v1.6.1
[11:27:18] INFO     Using the default configuration file, which you can modify in `/Users/zheng/anaconda3/envs/manim/lib/python3.10/site-packages/manimlib/default_config.yml`                                                                                         config.py:265
           INFO     If you want to create a local configuration file, you can create a file named `custom_config.yml`, or run `manimgl --config`                                                                                                                       config.py:266
[11:27:20] INFO     Tips: You are now in the interactive mode. Now you can use the keyboard and the mouse to interact with the scene. Just press `q` if you want to quit.

运行后,就会出现一个窗口显示如下画面。

python manim实现排序算法动画示例

代码说明

上面代码中,通过继承父类 Scene 然后重新父类的 construct 来构建一个场景。

然后在场景中添加了矩形(Rectangle)和文本(Text),并且将这两个元素添加到了 VGroup 类中。

再用一个 VGroup 来包含所有的 VGroup,通过调用 arrange 方法来排列这些元素。第一个 RIGHT 参数表示所有元素向右依次排列,aligned_edge 表示对齐的边,这里我们传入 DOWN 将底边对齐。

最后使用 self.add() 方法把 VGroup 添加到场景中。

Rectangle 类定义了矩形的创建,更多图形可以查看 docs.manim.org.cn/documentati…

元素交换动画

通过算法步骤的第一步:比较相邻的元素。如果第一个比第二个大,就交换他们两个。就涉及到了交换的动画。

一开始,我用 manim 提供的 CyclicReplace 方法来交换两个元素。效果如下:

self.play(CyclicReplace(g[0], g[1]))
self.wait()

python manim实现排序算法动画示例

交换是交换了,但是交换后对齐的边变成了顶部对齐了,不符合预期。于是继续查看文档,最终决定使用元素的 target 属性来进行交换动画的制作。

上面我们要交换 g(0)g(1) 两个元素,所以我们定义这两个交换元素的 target

g[0].generate_target()
g[0].target.next_to(g[1],ORIGIN,aligned_edge=DOWN)
g[1].generate_target()
g[1].target.next_to(g[0],ORIGIN,aligned_edge=DOWN)

generate_target() 表示生成元素的 target, next_to() 表示将元素移动到指定的位置。

比如 g[0],我们先生成元素的 target,然后操作 target 将元素通过 next_to 方法移动到 g[1] 的位置。其中 ORIGIN 表示 g[1] 的所在位置。 我们对 g[1] 的元素也做类似的操作。

然后使用 MoveToTarget 来将元素转换到定义的 target 上,通过调用 self.play() 方法来播放动画。

self.play(MoveToTarget(g[0]),MoveToTarget(g[1]))

python manim实现排序算法动画示例

嗯~完美符合预期。

实现代码

根据上面的知识点,接下来就可以编写一个冒泡排序的动画了。

这里在初始化场景元素时,额外添加了一个数组来存放所有场景元素,因为在交换元素位置后,也要交换对应索引下的元素,如果直接用 VGroup 来交换时,会出现问题。

self.g[j],self.g[j+1] = self.g[j+1],self.g[j]
TypeError: 'VGroup' object does not support item assignment

所以用额外的数组去接收。

还添加了一个 Indicate 方法,当涉及到对应交换的元素时,会做一个类似对焦的动作。

from manimlib import *
class BubbleSort(Scene):
   def construct(self):
       self.COLOR = [BLUE, GREEN, RED, PINK, ORANGE, MAROON_B, TEAL, PURPLE_B, GREY_BROWN]
       self.bubbleSort([4,2,3,1,5])
   def init_vmobj(self,arr):
       '''
           初始化场景元素
       '''
       self.vmArr = []
       g = VGroup()
       for i in range(len(arr)):
           r1=Rectangle(width=1,height=arr[i]/2,fill_color=self.COLOR[i%len(self.COLOR)],fill_opacity=1)
           t1=Text(str(arr[i])).scale(0.5)
           rec = VGroup(r1,t1)
           self.vmArr.append(rec)
           g.add(rec)
       g.arrange(RIGHT,aligned_edge=DOWN)
       self.add(g)
       self.wait()
   def bubbleSort(self,arr):
       '''
           冒泡排序
       '''
       self.init_vmobj(arr)
       for i in range(1, len(arr)):
           for j in range(0, len(arr)-i):
               self.play(Indicate(self.vmArr[j]))
               self.play(Indicate(self.vmArr[j+1],color=RED))
               if arr[j] > arr[j+1]:
                   arr[j], arr[j + 1] = arr[j + 1], arr[j]
                   self.cyc_move(self.vmArr[j],self.vmArr[j+1])
                   self.vmArr[j],self.vmArr[j+1] = self.vmArr[j+1],self.vmArr[j]
       return arr
   def cyc_move(self,vm1,vm2):
       '''
           交换两个元素位置
       '''
       vm1.generate_target()
       vm1.target.next_to(vm2,ORIGIN,aligned_edge=DOWN)
       vm2.generate_target()
       vm2.target.next_to(vm1,ORIGIN,aligned_edge=DOWN)
       self.play(MoveToTarget(vm1),MoveToTarget(vm2))
       self.wait()

python manim实现排序算法动画示例

本文不介绍 manim 的安装教程,需要安装教程的请参考:docs.manim.org.cn/getting_sta

来源:https://juejin.cn/post/7130528931975233566

0
投稿

猜你喜欢

  • 众所周知windows平台漏洞百出,补丁一个接一个,但总是补也补不净。我把我所知道的看asp源码的方法总结了一下,并且用c#写了个应用程序来
  • 本文的重点就是如何创建一个PHP类来实现两个数间的加减乘除,这种类似于极简单的计算器功能。实现起来是非常简单的,继续往下看:这里简单给大家介
  • 安装Apache1.安装yum -y install httpd2.开启apache服务systemctl start httpd.serv
  • 您可以将SQL Server 数据库引擎升级到 SQL Server 2008。SQL Server 安装程序只需最少的用户干预就可升级 S
  • Python引入了一个机制:引用计数。引用计数python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,
  • 本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义,
  • 之前在比赛的时候需要用Python实现灰色关联分析,从网上搜了下只有实现两个列之间的,于是我把它改写成了直接想Pandas中的计算工具直接计
  • 环境:Zend Studio 8.0Zend Studio是PHP开发者的首选开发工具,其地位相当于微软开发工具中的Visual Studi
  • 本文实例讲述了php 多继承的几种常见实现方法。分享给大家供大家参考,具体如下:class Parent1 {  function
  • js的成员和方法好象没有private和public之分,列一下public的成员和方法成员:name 控件的名字,既这个控件的变量名(必选
  • 本文实例讲述了js实现全国省市二级联动下拉选择菜单,分享给大家供大家参考。具体如下:效果图: 具体代码:<html>&
  • 先介绍一下jsSmarty Project:简要说明:利用JavaScript?在客户端完成SmartyPhp的工作,加速模板开发。主要是利
  • 1. python-firepython-fire 是一个三方库,可以将任何 Python 对象变成一个命令行接口。使用前先 pip ins
  • 减少HTTP请求,是可以提高网站速度的,把所有的背景图像都放到一个图片文件中,然后通过CSS的background-image和backgr
  • 互联网上的资源多不胜数,无论我们搜索资料还是查阅新闻,或者是在网上淘物等等,肯定没少见分页!分页模式和表现方法也是各有千秋。我们来看看下面这
  • 很多人说设计是力求细节的,在网页设计里表达出的细节就是图标。图标在一个设计里带来了额外的注解并且使设计里的对象和元素引起用户的注意。以下介绍
  • rem ---表单提示函数 Being-----------------------------CODE Copy ...  Fu
  • 要求:编写登陆接口输入用户名密码认证成功后显示欢迎信息输错三次后锁定针对此实例写了有二种类型的脚本,略有不同,具体如下:帐号文件accoun
  •  中文简繁体网页的转换FrontPage 2002提供了中文简繁体转换的功能。只要轻轻一点就可做出简体或繁体中文网站了。如要将当前
  • 听说最近流行JQ风格的语法,不流行EXT风格了一.//ajax类fw=window.fw||{};fw.ajax = { &nbs
手机版 网络编程 asp之家 www.aspxhome.com