<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Manim 是一個用於精確程式設計動畫的引擎,專為建立解釋性數學視訊而設計。
注意,有兩個主要版本的 manim。該儲存庫最初是 3Blue1Brown 的作者的個人專案,目的是為這些視訊製作動畫,此處提供了視訊專用程式碼。2020 年,一群開發人員將其分叉成現在的社群版,目標是更穩定、更好地測試、更快地響應社群貢獻,以及更友好地開始使用。
主要版本如下:
本文就使用 manim 來實現一個氣泡排序的動畫,首先來了解下什麼是氣泡排序
氣泡排序(Bubble Sort)也是一種簡單直觀的排序演演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演演算法的名字由來是因為越小的元素會經由交換慢慢"浮"到數列的頂端。
比如我們需要排序陣列為: [4,2,3,1,5]
首先,需要在 manim 場景上初始化我們的需要排序的所有元素,這裡用矩形來表示。
在 manim 中,可以用 Rectangle
來初始化矩形,然後我們通過設定元素不同的高度來表示不同的元素大小。
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排序演演算法動畫的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45