溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python?manim如何實現(xiàn)排序算法動畫

發(fā)布時間:2022-08-13 10:10:44 來源:億速云 閱讀:157 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了python manim如何實現(xiàn)排序算法動畫的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇python manim如何實現(xiàn)排序算法動畫文章都會有所收獲,下面我們一起來看看吧。

    什么是 manim

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

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

    冒泡排序介紹

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

    算法步驟

    • 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

    • 對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。

    • 針對所有的元素重復(fù)以上的步驟,除了最后一個。

    • 持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。

    初始化元素

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

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

    在 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)行后,就會出現(xiàn)一個窗口顯示畫面。

    代碼說明

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

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

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

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

    Rectangle 類定義了矩形的創(chuàng)建

    元素交換動畫

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

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

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

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

    上面我們要交換 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 來將元素轉(zhuǎn)換到定義的 target 上,通過調(diào)用 self.play() 方法來播放動畫。

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

    實現(xiàn)代碼

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

    這里在初始化場景元素時,額外添加了一個數(shù)組來存放所有場景元素,因為在交換元素位置后,也要交換對應(yīng)索引下的元素,如果直接用 VGroup 來交換時,會出現(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ù)組去接收。

    還添加了一個 Indicate 方法,當(dāng)涉及到對應(yī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):
            '''
                初始化場景元素
            '''
            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()

    關(guān)于“python manim如何實現(xiàn)排序算法動畫”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“python manim如何實現(xiàn)排序算法動畫”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI