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

目录
  • 什么是 manim
  • 冒泡排序介绍
    • 算法步骤
  • 初始化元素
  • 代码说明
  • 元素交换动画
  • 实现代码

什么是 manim

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

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

主要版本如下:

冒泡排序介绍

本文就使用 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.

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

代码说明

上面代码中,通过继承父类 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()

交换是交换了,但是交换后对齐的边变成了顶部对齐了,不符合预期。于是继续查看文档,最终决定使用元素的 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]))

嗯~完美符合预期。

实现代码

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

这里在初始化场景元素时,额外添加了一个数组来存放所有场景元素,因为在交换元素位置后,也要交换对应索引下的元素,如果直接用 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

更多关于python manim排序算法动画的资料请关注我们其它相关文章!

(0)

相关推荐

  • python3实现常见的排序算法(示例代码)

    冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. def mao(lst): for i in range(len(lst)): # 由于每一轮结束后,总一定有一个大的数排在后面 # 而且后面的数已经排好了 # 即i轮之后,就有i个数字被排好 # 所以其 len-1 -i到

  • Python 十大经典排序算法实现详解

    目录 关于时间复杂度 关于稳定性 名词解释 1.冒泡排序 (1)算法步骤 (2)动图演示 (3)Python代码 2.选择排序 (1)算法步骤 (2)动图演示 (3)Python代码 3.插入排序 (1)算法步骤 (2)动图演示 (3)Python代码 4.希尔排序 (1)算法步骤 (2)Python代码 5.归并排序 (1)算法步骤 (2)动图演示 (3)Python代码 6.快速排序 (1)算法步骤 (2)动图演示 (3)Python代码 7.堆排序 (1)算法步骤 (2)动图演示 (3)P

  • 使用Python快乐学数学Github万星神器Manim简介

    高考在即,笔者想为孩子以后能够快乐学习数学.学习编程找到一个比较合适的项目,经过一番比较发现github上的万星项目manim(https://github.com/3b1b/manim)就非常好.它能够快速构建有关数学的动画,而且非常精确形象.  安装Manim 虽然manim已经支持Python3.7的,不过安装起来还是比较麻烦,我在ubantu18.04上直接使用安装的过程如下: 1.首先尝试直接使用pip install manimlib命令安装,但是会有以下报错 Cannot unin

  • Python 数据结构之十大经典排序算法一文通关

    目录 1.冒泡排序 算法演示 算法步骤 算法实现 2.选择排序 算法演示 算法步骤 算法实现 3.简单插入排序 算法演示 算法步骤 算法实现 4.希尔排序 算法演示 算法步骤 算法实现 5.归并排序 算法演示 算法步骤 算法实现 6.快速排序 算法演示 算法步骤 算法实现 7.堆排序 算法演示 算法步骤 算法实现 8.计数排序 算法演示 算法步骤 算法实现 9.桶排序 算法演示 算法步骤 算法实现 10.基数排序 算法演示 算法步骤 算法实现 一文搞掂十大经典排序算法 今天整理一下十大经典排序算

  • python如何实现常用的五种排序算法详解

    一.冒泡排序 原理: 比较相邻的元素.如果第一个比第二个大就交换他们两个 每一对相邻元素做同样的工作,直到结尾最后一对 每个元素都重复以上步骤,除了最后一个 第一步: 将乱序中的最大值找出,逐一移到序列最后的位置 alist = [3, 5, 9, 2, 1, 7, 8, 6, 4] def bubble_sort(alist): # 找最大值的方式是通过对列表中的元素进行两两比较,值大的元素逐步向后移动 # 序列中有n个元素,两两比较的话,需要比较n-1次 for i in range(len

  • Android RecyclerView的Item自定义动画及DefaultItemAnimator源码分析

    这是关于RecyclerView的第二篇,说的是如何自定义Item动画,但是请注意,本文不包含动画的具体实现方法,只是告诉大家如何去自定义动画,如何去参考源代码. 我们知道,RecyclerView默认会使用DefaultItemAnimator,所以如果我们需要自定义动画,那么应该好好的读读这个类的源代码,这样不仅仅是学习怎么自定义,还要学习Android的设计模式. 先弄明白一件事,DefaultItemAnimator继承自SimpleItemAnimator,SimpleItemAnim

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

    目录 什么是 manim 冒泡排序介绍 算法步骤 初始化元素 代码说明 元素交换动画 实现代码 什么是 manim Manim 是一个用于精确编程动画的引擎,专为创建解释性数学视频而设计. 注意,有两个主要版本的 manim.该存储库最初是 3Blue1Brown 的作者的个人项目,目的是为这些视频制作动画,此处提供了视频专用代码.2020 年,一群开发人员将其分叉成现在的社区版,目标是更稳定.更好地测试.更快地响应社区贡献,以及更友好地开始使用. 主要版本如下: 3b1b/manim [最新版

  • python实现经典排序算法的示例代码

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后会将次大的元素移到最大元素的左边,每次内层循环结束都会将一个元素排好序. def bubble_sort(arr): length = len(arr) for i in range(length): for j in range(length - i - 1): if arr[j] > arr[j

  • Python八大常见排序算法定义、实现及时间消耗效率分析

    本文实例讲述了Python八大常见排序算法定义.实现及时间消耗效率分析.分享给大家供大家参考,具体如下: 昨晚上开始总结了一下常见的几种排序算法,由于之前我已经写了好几篇排序的算法的相关博文了现在总结一下的话可以说是很方便的,这里的目的是为了更加完整详尽的总结一下这些排序算法,为了复习基础的东西,从冒泡排序.直接插入排序.选择排序.归并排序.希尔排序.桶排序.堆排序.快速排序入手来分析和实现,在最后也给出来了简单的时间统计,重在原理.算法基础,其他的次之,这些东西的熟练掌握不算是对之后的工作或者

  • python实现八大排序算法(2)

    本文接上一篇博客python实现的八大排序算法part1,将继续使用python实现八大排序算法中的剩余四个:快速排序.堆排序.归并排序.基数排序 5.快速排序 快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的. 算法思想: 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先任取数据a[x]作为基准.比较a[x]与其它数据并排序,使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数

  • python实现八大排序算法(1)

    排序 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.分内部排序和外部排序.若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序.反之,若参加排序的记录数量很大,整个序列的排序过程不可能完全在内存中完成,需要访问外存,则称此类排序问题为外部排序.内部排序的过程是一个逐步扩大记录的有序序列长度的过程. 看图使理解更清晰深刻: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序

  • Python实现七大查找算法的示例代码

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素.     查找表(Search Table):由同一类型的数据元素构成的集合     关键字(Key):数据元素中某个数据项的值,又称为键值     主键(Primary Key):可唯一的标识某个数据元素或记录的关键字 查找表按照操作方式可分为:         1.静态查找表(Static Search Table):只做查找操作的查找表.它的主要操作是:         ①

  • Python实现K-近邻算法的示例代码

    目录 一.介绍 二.k-近邻算法的步骤 三.Python 实现 四.约会网站配对效果判定 五.手写数字识别 六.算法优缺点 优点 缺点 一.介绍 k-近邻算法(K-Nearest Neighbour algorithm),又称 KNN 算法,是数据挖掘技术中原理最简单的算法. 工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的 k 个实例,如果这 k 个实例的多数属于某个类别,那么新数据就属于这个类别.简单理解为:由那些离 X 最近的 k 个点

  • JavaScript排序算法动画演示效果的实现方法

    之前在知乎看到有人在问 自己写了一个冒泡排序算法如何用HTML,CSS,JavaScript展现出来排序过程.   感觉这个问题还挺有意思 .前些时间就来写了一个.这里记录一下实现过程. 基本的思想是把排序每一步的时候每个数据的值用DOM结构表达出来. 问题一:如何将JavaScript排序的一步步进程展现出来? 我试过的几种思路: 1.让JavaScript暂停下来,慢下来. JavaScript排序是很快的,要我们肉眼能看到它的实现过程,我首先想到的是让排序慢下来. 排序的每一个循环都让它停

  • java实现的各种排序算法代码示例

    折半插入排序 折半插入排序是对直接插入排序的简单改进.此处介绍的折半插入,其实就是通过不断地折半来快速确定第i个元素的 插入位置,这实际上是一种查找算法:折半查找.Java的Arrays类里的binarySearch()方法,就是折半查找的实现,用 于从指定数组中查找指定元素,前提是该数组已经处于有序状态.与直接插入排序的效果相同,只是更快了一些,因 为折半插入排序可以更快地确定第i个元素的插入位置 代码: package interview; /** * @author Administrat

  • python实现bucket排序算法实例分析

    本文实例讲述了python实现bucket排序算法.分享给大家供大家参考.具体实现方法如下: def bucketSort(a, n, buckets, m): for j in range(m): buckets[j] = 0 for i in range(n): buckets[a[i]] += 1 i = 0 for j in range(m): for k in range(buckets[j]): a[i] = j i += 1 希望本文所述对大家的Python程序设计有所帮助.

随机推荐