最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python manim實(shí)現(xiàn)排序算法動(dòng)畫示例

 更新時(shí)間:2022年08月12日 15:28:33   作者:ooooooh灰灰  
這篇文章主要為大家介紹了python manim實(shí)現(xiàn)排序算法動(dòng)畫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是 manim

Manim 是一個(gè)用于精確編程動(dòng)畫的引擎,專為創(chuàng)建解釋性數(shù)學(xué)視頻而設(shè)計(jì)。

注意,有兩個(gè)主要版本的 manim。該存儲(chǔ)庫最初是 3Blue1Brown 的作者的個(gè)人項(xiàng)目,目的是為這些視頻制作動(dòng)畫,此處提供了視頻專用代碼。2020 年,一群開發(fā)人員將其分叉成現(xiàn)在的社區(qū)版,目標(biāo)是更穩(wěn)定、更好地測(cè)試、更快地響應(yīng)社區(qū)貢獻(xiàn),以及更友好地開始使用。

主要版本如下:

冒泡排序介紹

本文就使用 manim 來實(shí)現(xiàn)一個(gè)冒泡排序的動(dòng)畫,首先來了解下什么是冒泡排序

冒泡排序(Bubble Sort)也是一種簡(jiǎn)單直觀的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢"浮"到數(shù)列的頂端。

算法步驟

  • 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
  • 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。
  • 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
  • 持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。

初始化元素

比如我們需要排序數(shù)組為: [4,2,3,1,5]

首先,需要在 manim 場(chǎng)景上初始化我們的需要排序的所有元素,這里用矩形來表示。

在 manim 中,可以用 Rectangle 來初始化矩形,然后我們通過設(shè)置元素不同的高度來表示不同的元素大小。

  • 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()

使用下面的命令運(yùn)行上面的代碼:

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.

運(yùn)行后,就會(huì)出現(xiàn)一個(gè)窗口顯示如下畫面。

代碼說明

上面代碼中,通過繼承父類 Scene 然后重新父類的 construct 來構(gòu)建一個(gè)場(chǎng)景。

然后在場(chǎng)景中添加了矩形(Rectangle)和文本(Text),并且將這兩個(gè)元素添加到了 VGroup 類中。

再用一個(gè) VGroup 來包含所有的 VGroup,通過調(diào)用 arrange 方法來排列這些元素。第一個(gè) RIGHT 參數(shù)表示所有元素向右依次排列,aligned_edge 表示對(duì)齊的邊,這里我們傳入 DOWN 將底邊對(duì)齊。

最后使用 self.add() 方法把 VGroup 添加到場(chǎng)景中。

Rectangle 類定義了矩形的創(chuàng)建,更多圖形可以查看 docs.manim.org.cn/documentati…

元素交換動(dòng)畫

通過算法步驟的第一步:比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。就涉及到了交換的動(dòng)畫。

一開始,我用 manim 提供的 CyclicReplace 方法來交換兩個(gè)元素。效果如下:

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

交換是交換了,但是交換后對(duì)齊的邊變成了頂部對(duì)齊了,不符合預(yù)期。于是繼續(xù)查看文檔,最終決定使用元素的 target 屬性來進(jìn)行交換動(dòng)畫的制作。

上面我們要交換 g(0)g(1) 兩個(gè)元素,所以我們定義這兩個(gè)交換元素的 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() 表示將元素移動(dòng)到指定的位置。

比如 g[0],我們先生成元素的 target,然后操作 target 將元素通過 next_to 方法移動(dòng)到 g[1] 的位置。其中 ORIGIN 表示 g[1] 的所在位置。 我們對(duì) g[1] 的元素也做類似的操作。

然后使用 MoveToTarget 來將元素轉(zhuǎn)換到定義的 target 上,通過調(diào)用 self.play() 方法來播放動(dòng)畫。

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

嗯~完美符合預(yù)期。

實(shí)現(xiàn)代碼

根據(jù)上面的知識(shí)點(diǎn),接下來就可以編寫一個(gè)冒泡排序的動(dòng)畫了。

這里在初始化場(chǎng)景元素時(shí),額外添加了一個(gè)數(shù)組來存放所有場(chǎng)景元素,因?yàn)樵诮粨Q元素位置后,也要交換對(duì)應(yīng)索引下的元素,如果直接用 VGroup 來交換時(shí),會(huì)出現(xiàn)問題。

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

所以用額外的數(shù)組去接收。

還添加了一個(gè) Indicate 方法,當(dāng)涉及到對(duì)應(yīng)交換的元素時(shí),會(huì)做一個(gè)類似對(duì)焦的動(dòng)作。

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):
        '''
            初始化場(chǎng)景元素
        '''
        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):
        '''
            交換兩個(gè)元素位置
        '''
        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實(shí)現(xiàn)排序算法動(dòng)畫示例的詳細(xì)內(nèi)容

本文不介紹 manim 的安裝教程,需要安裝教程的請(qǐng)參考:docs.manim.org.cn/getting_sta

更多關(guān)于python manim排序算法動(dòng)畫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python3 實(shí)現(xiàn)一行輸入,空格隔開的示例

    python3 實(shí)現(xiàn)一行輸入,空格隔開的示例

    今天小編就為大家分享一篇python3 實(shí)現(xiàn)一行輸入,空格隔開的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • keras 兩種訓(xùn)練模型方式詳解fit和fit_generator(節(jié)省內(nèi)存)

    keras 兩種訓(xùn)練模型方式詳解fit和fit_generator(節(jié)省內(nèi)存)

    這篇文章主要介紹了keras 兩種訓(xùn)練模型方式詳解fit和fit_generator(節(jié)省內(nèi)存),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 使用matplotlib庫實(shí)現(xiàn)圖形局部數(shù)據(jù)放大顯示的實(shí)踐

    使用matplotlib庫實(shí)現(xiàn)圖形局部數(shù)據(jù)放大顯示的實(shí)踐

    本文主要介紹了使用matplotlib庫實(shí)現(xiàn)圖形局部數(shù)據(jù)放大顯示的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲)

    詳解Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲)

    這篇文章主要介紹了Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • python3實(shí)現(xiàn)讀取chrome瀏覽器cookie

    python3實(shí)現(xiàn)讀取chrome瀏覽器cookie

    這里給大家分享的是python3讀取chrome瀏覽器的cookie(CryptUnprotectData解密)的代碼,主要思路是讀取到的cookies被封裝成字典,可以直接給requests使用。
    2016-06-06
  • Python基礎(chǔ)知識(shí)快速上手入門學(xué)習(xí)

    Python基礎(chǔ)知識(shí)快速上手入門學(xué)習(xí)

    本篇文章使用代碼示例,一看就會(huì),從基礎(chǔ)語法、變量類型、運(yùn)算符和條件語句多個(gè)方面詳細(xì)闡述了Python基礎(chǔ)知識(shí)快速上手入門學(xué)習(xí)的內(nèi)容,希望本文能對(duì)Python初學(xué)者有所幫助
    2023-08-08
  • Python強(qiáng)制重新安裝Python包之pip的高級(jí)使用技巧

    Python強(qiáng)制重新安裝Python包之pip的高級(jí)使用技巧

    這篇文章主要介紹了如何使用pip強(qiáng)制重新安裝Python包的幾種方法,包括使用--upgrade、--force-reinstall和--no-deps選項(xiàng),這些方法可以幫助解決包損壞、依賴問題或其他需要重新安裝包的情況,需要的朋友可以參考下
    2025-03-03
  • Python六大開源框架對(duì)比

    Python六大開源框架對(duì)比

    在這篇文章里,我們將為Python Web開發(fā)者回顧基于Python的6大Web應(yīng)用框架。無論你是出于愛好還是需求,這六大框架都可能會(huì)成為你工作上不錯(cuò)的得力助手。
    2015-10-10
  • Python 網(wǎng)頁解析HTMLParse的實(shí)例詳解

    Python 網(wǎng)頁解析HTMLParse的實(shí)例詳解

    這篇文章主要介紹了Python 網(wǎng)頁解析HTMLParse的實(shí)例詳解的相關(guān)資料,python里提供了一個(gè)簡(jiǎn)單的解析模塊HTMLParser類,使用起來也是比較簡(jiǎn)單的,解析語法沒有用到XPath類似的簡(jiǎn)潔模式,需要的朋友可以參考下
    2017-08-08
  • Django REST framework 異常處理

    Django REST framework 異常處理

    本文將結(jié)合實(shí)例代碼,介紹Django REST framework 異常處理,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07

最新評(píng)論

清镇市| 正定县| 德江县| 大城县| 齐齐哈尔市| 孝昌县| 佛冈县| 册亨县| 洛川县| 塔城市| 庄浪县| 施秉县| 新建县| 江山市| 嘉义县| 和静县| 澄江县| 射洪县| 禹州市| 辽宁省| 青川县| 阜宁县| 合作市| 合山市| 克什克腾旗| 房产| 丰顺县| 滨海县| 开江县| 郑州市| 和政县| 木兰县| 益阳市| 苗栗市| 孝昌县| 黔西县| 吴桥县| 慈溪市| 惠东县| 射洪县| 山阳县|