版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第pythonmanim實(shí)現(xiàn)排序算法動(dòng)畫(huà)示例目錄什么是manim冒泡排序介紹算法步驟初始化元素代碼說(shuō)明元素交換動(dòng)畫(huà)實(shí)現(xiàn)代碼
什么是manim
Manim是一個(gè)用于精確編程動(dòng)畫(huà)的引擎,專(zhuān)為創(chuàng)建解釋性數(shù)學(xué)視頻而設(shè)計(jì)。
注意,有兩個(gè)主要版本的manim。該存儲(chǔ)庫(kù)最初是3Blue1Brown的作者的個(gè)人項(xiàng)目,目的是為這些視頻制作動(dòng)畫(huà),此處提供了視頻專(zhuān)用代碼。2025年,一群開(kāi)發(fā)人員將其分叉成現(xiàn)在的社區(qū)版,目標(biāo)是更穩(wěn)定、更好地測(cè)試、更快地響應(yīng)社區(qū)貢獻(xiàn),以及更友好地開(kāi)始使用。
主要版本如下:
3b1b/manim【最新版】cairo-backend【舊版】ManimCommunity/manim【社區(qū)版】
冒泡排序介紹
本文就使用manim來(lái)實(shí)現(xiàn)一個(gè)冒泡排序的動(dòng)畫(huà),首先來(lái)了解下什么是冒泡排序
冒泡排序(BubbleSort)也是一種簡(jiǎn)單直觀的排序算法。它重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過(guò)來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢浮到數(shù)列的頂端。
算法步驟
比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
初始化元素
比如我們需要排序數(shù)組為:[4,2,3,1,5]
首先,需要在manim場(chǎng)景上初始化我們的需要排序的所有元素,這里用矩形來(lái)表示。
在manim中,可以用Rectangle來(lái)初始化矩形,然后我們通過(guò)設(shè)置元素不同的高度來(lái)表示不同的元素大小。
main.py
frommanimlibimport*
classTest(Scene):
defconstruct(self):
COLOR=[BLUE,GREEN,RED,PINK,ORANGE,MAROON_B,TEAL,PURPLE_B,GREY_BROWN]
arr=[4,2,3,1,5]
g=VGroup()
foriinrange(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)行上面的代碼:
manimglmain.pyBubbleSort
ManimGLv1.6.1
[11:27:18]INFOUsingthedefaultconfigurationfile,whichyoucanmodifyin`/Users/zheng/anaconda3/envs/manim/lib/python3.10/site-packages/manimlib/default_config.yml`config.py:265
INFOIfyouwanttocreatealocalconfigurationfile,youcancreateafilenamed`custom_config.yml`,orrun`manimgl--config`config.py:266
[11:27:20]INFOTips:Youarenowintheinteractivemode.Nowyoucanusethekeyboardandthemousetointeractwiththescene.Justpress`q`ifyouwanttoquit.
運(yùn)行后,就會(huì)出現(xiàn)一個(gè)窗口顯示如下畫(huà)面。
代碼說(shuō)明
上面代碼中,通過(guò)繼承父類(lèi)Scene然后重新父類(lèi)的construct來(lái)構(gòu)建一個(gè)場(chǎng)景。
然后在場(chǎng)景中添加了矩形(Rectangle)和文本(Text),并且將這兩個(gè)元素添加到了VGroup類(lèi)中。
再用一個(gè)VGroup來(lái)包含所有的VGroup,通過(guò)調(diào)用arrange方法來(lái)排列這些元素。第一個(gè)RIGHT參數(shù)表示所有元素向右依次排列,aligned_edge表示對(duì)齊的邊,這里我們傳入DOWN將底邊對(duì)齊。
最后使用self.add()方法把VGroup添加到場(chǎng)景中。
Rectangle類(lèi)定義了矩形的創(chuàng)建,更多圖形可以查看/documentati
元素交換動(dòng)畫(huà)
通過(guò)算法步驟的第一步:比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。就涉及到了交換的動(dòng)畫(huà)。
一開(kāi)始,我用manim提供的CyclicReplace方法來(lái)交換兩個(gè)元素。效果如下:
self.play(CyclicReplace(g[0],g[1]))
self.wait()
交換是交換了,但是交換后對(duì)齊的邊變成了頂部對(duì)齊了,不符合預(yù)期。于是繼續(xù)查看文檔,最終決定使用元素的target屬性來(lái)進(jìn)行交換動(dòng)畫(huà)的制作。
上面我們要交換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將元素通過(guò)next_to方法移動(dòng)到g[1]的位置。其中ORIGIN表示g[1]的所在位置。我們對(duì)g[1]的元素也做類(lèi)似的操作。
然后使用MoveToTarget來(lái)將元素轉(zhuǎn)換到定義的target上,通過(guò)調(diào)用self.play()方法來(lái)播放動(dòng)畫(huà)。
self.play(MoveToTarget(g[0]),MoveToTarget(g[1]))
嗯~完美符合預(yù)期。
實(shí)現(xiàn)代碼
根據(jù)上面的知識(shí)點(diǎn),接下來(lái)就可以編寫(xiě)一個(gè)冒泡排序的動(dòng)畫(huà)了。
這里在初始化場(chǎng)景元素時(shí),額外添加了一個(gè)數(shù)組來(lái)存放所有場(chǎng)景元素,因?yàn)樵诮粨Q元素位置后,也要交換對(duì)應(yīng)索引下的元素,如果直接用VGroup來(lái)交換時(shí),會(huì)出現(xiàn)問(wèn)題。
self.g[j],self.g[j+1]=self.g[j+1],self.g[j]
TypeError:'VGroup'objectdoesnotsupportitemassignment
所以用額外的數(shù)組去接收。
還添加了一個(gè)Indicate方法,當(dāng)涉及到對(duì)應(yīng)交換的元素時(shí),會(huì)做一個(gè)類(lèi)似對(duì)焦的動(dòng)作。
frommanimlibimport*
classBubbleSort(Scene):
defconstruct(self):
self.COLOR=[BLUE,GREEN,RED,PINK,ORANGE,MAROON_B,TEAL,PURPLE_B,GREY_BROWN]
self.bubbleSort([4,2,3,1,5])
definit_vmobj(self,arr):
初始化場(chǎng)景元素
self.vmArr=[]
g=VGroup()
foriinrange(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()
defbubbleSort(self,arr):
冒泡排序
self.init_vmobj(arr)
foriinrange(1,len(arr)):
forjinrange(0,len(arr)-i):
self.play(Indicate(self.vmArr[j]))
self.play(Indicate(self.vmArr[j+1],color=RED))
ifarr[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]
returnarr
defcyc_move(self,vm1,vm2):
交換兩個(gè)元素位置
vm1.generate_target()
vm1.target.next_to(vm2,ORIGIN,aligned_edge=DOWN)
vm2.generate_target()
vm2.ta
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院招聘放射專(zhuān)業(yè)試題及答案
- 怒江傈僳族自治州貢山獨(dú)龍族怒族自治縣輔警公共基礎(chǔ)知識(shí)題庫(kù)(附答案)
- 宿遷市宿豫區(qū)輔警招聘警務(wù)輔助人員考試題庫(kù)真題試卷公安基礎(chǔ)知識(shí)及答案
- 數(shù)控編程四級(jí)試題及答案
- 規(guī)培護(hù)士院感防控培訓(xùn)考試題及答案
- 醫(yī)院檢驗(yàn)科試題含答案
- 事業(yè)單位公共基礎(chǔ)知識(shí)簡(jiǎn)答題及答案
- 基金專(zhuān)場(chǎng)考試題庫(kù)及答案
- 美團(tuán)考試題庫(kù)及答案
- 防火安全測(cè)試題及答案
- 貿(mào)易公司組織架構(gòu)與部門(mén)職責(zé)一覽表
- 《電梯基本結(jié)構(gòu)》課件
- 供水管道緊急搶修工程合同
- DL∕T 1993-2019 電氣設(shè)備用六氟化硫氣體回收、再生及再利用技術(shù)規(guī)范
- (正式版)HGT 20593-2024 鋼制化工設(shè)備焊接與檢驗(yàn)工程技術(shù)規(guī)范
- 肘關(guān)節(jié)恐怖三聯(lián)征
- 兒童發(fā)育遲緩的早期干預(yù)與教育策略
- 刀模管理制度
- NB-T 47013.2-2015 承壓設(shè)備無(wú)損檢測(cè) 第2部分-射線檢測(cè)
- 工程施工月報(bào)表
- GB/T 3098.6-2023緊固件機(jī)械性能不銹鋼螺栓、螺釘和螺柱
評(píng)論
0/150
提交評(píng)論