0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Manim:一個Python數(shù)學(xué)動畫開發(fā)模塊

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-10-17 11:21 ? 次閱讀

Manim 是3b1b開源的一個特別漂亮的數(shù)學(xué)動畫模塊。

我們能夠基于Manim繪制許多解釋性的動畫,比如下面這個:

圖片

也支持函數(shù)圖像:

圖片

甚至是一些3D視圖和矩陣變換,Manim都可以輕易實現(xiàn):

如果你是一個數(shù)學(xué)課程的演講者,或者你需要給觀眾演示某些數(shù)學(xué)公式的圖形,那么Manim就是你的不二之選。

Manim 支持 Python 3.7 及以上版本,推薦Python3.8.

1.準備

開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細Python安裝指南 進行安裝。

**(可選1) **如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點:Python 編程的最好搭檔—VSCode 詳細指南

請選擇以下任一種方式輸入命令安裝依賴

  1. Windows 環(huán)境 打開 Cmd (開始-運行-CMD)。
  2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
conda create --name manim python=3.8 # 創(chuàng)建虛擬環(huán)境
conda activate manim # 切換到此虛擬環(huán)境
pip install manimgl # 安裝manim

安裝完畢后在終端輸入 manimgl,會出現(xiàn)如下的界面,說明安裝完成。

圖片

2. Manim 基本使用

首先學(xué)會畫一個基本的數(shù)學(xué)圖形,如圓圈:

from manimlib import *

class SquareToCircle(Scene):
    def construct(self):
        circle = Circle()
        circle.set_fill(BLUE, opacity=0.5)
        circle.set_stroke(BLUE_E, width=4)

        self.add(circle)

編寫完畢后,在終端里敲下這行命令:

manimgl 你的py文件名.py SquareToCircle

就能彈出一個圖形界面,繪制完成:

圖片

你還可以操作彈出的這個窗口:

  • 滾動鼠標中鍵來上下移動畫面
  • 按住鍵盤上 z 鍵的同時滾動鼠標中鍵來縮放畫面
  • 按住鍵盤上 f 鍵的同時移動鼠標來平移畫面
  • 按住鍵盤上 d 鍵的同時移動鼠標來改變?nèi)S視角
  • 按下鍵盤上 r 鍵恢復(fù)到最初的視角

最后,你可以通過按 q 來關(guān)閉窗口并退出程序。

接下來,我們學(xué)習(xí)如何讓圓形變成方形:

# 公眾號: Python實用寶典
from manimlib import *

class CircleToSquare(Scene):
    def construct(self):
        square = Square()
        square.set_fill(BLUE, opacity=0.5)
        square.set_stroke(BLUE_E, width=4)
        circle = Circle()

        self.play(ShowCreation(circle))
        self.wait()
        self.play(ReplacementTransform(circle, square))
        self.wait()

**ShowCreation: **演示圓圈繪制過程。

**ReplacementTransform: **延時從第一個參數(shù)的圖形變化到第二個參數(shù)的圖形的過程。

**self.wait(): **等待上個play操作執(zhí)行完成。

終端運行命令:

manimgl 你的py文件名.py CircleToSquare

效果如下:

圖片

再來一個復(fù)雜一點的演示,增加拉伸、旋轉(zhuǎn)和變換:

# 公眾號: Python實用寶典
from manimlib import *

class CircleToSquare(Scene):
    def construct(self):
        square = Square()
        square.set_fill(BLUE, opacity=0.5)
        square.set_stroke(BLUE_E, width=4)
        circle = Circle()

        self.play(ShowCreation(circle))
        self.wait()
        self.play(ReplacementTransform(circle, square))
        self.wait()
        # 在水平方向上拉伸到四倍
        self.play(square.animate.stretch(4, dim=0))
        self.wait()
        # 旋轉(zhuǎn)90°
        self.play(Rotate(square, TAU / 4))
        self.wait()
        # 在向右移動2單位同時縮小為原來的1/4
        self.play(square.animate.shift(2 * RIGHT), square.animate.scale(0.25))
        self.wait()
        # 為了非線性變換,給square增加10段曲線(不會播放動畫)
        square.insert_n_curves(10)
        # 給square上的所有點施加f(z)=z^2的復(fù)變換
        self.play(square.animate.apply_complex_function(lambda z: z**2))
        self.wait()

**square.animate.stretch: **將圖形拉伸第一個參數(shù)的倍數(shù),第二個維度指明方向,dim=0為水平方向,dim=1為垂直方向。

**square.animate.shift: **可以調(diào)整圖形位置和大小。

square.animate.apply_complex_function: 增加函數(shù)復(fù)變換。

效果如下:

圖片

3. Manim 坐標軸與函數(shù)圖像

想要實現(xiàn)函數(shù)圖像繪制,我們需要先添加坐標軸:

# 公眾號: Python實用寶典
from manimlib import *

class GraphExample(Scene):
    def construct(self):
        axes = Axes((-3, 10), (-1, 8))
        axes.add_coordinate_labels()

        self.play(Write(axes, lag_ratio=0.01, run_time=1))

運行以下命令顯示坐標軸:

manimgl 你的py文件名.py GraphExample

圖片

坐標軸繪制完成后,就可以開始繪制圖像了:

上滑查看更多代碼

class GraphExample(Scene):
def construct(self):
axes = Axes((-3,10), (-1,8))
axes.add_coordinate_labels()

self.play(Write(axes, lag_ratio=0.01, run_time=1))

# Axes.get_graph會返回傳入方程的圖像
sin_graph = axes.get_graph(
lambda x:2 * math.sin(x),
color=BLUE,
)
# 默認情況下,它在所有采樣點(x, f(x))之間稍微平滑地插值
# 但是,如果圖形有棱角,可以將use_smoothing設(shè)為False
relu_graph = axes.get_graph(
lambda x: max(x,0),
use_smoothing=False,
color=YELLOW,
)
# 對于不連續(xù)的函數(shù),你可以指定間斷點來讓它不試圖填補不連續(xù)的位置
step_graph = axes.get_graph(
lambda x:2.0 if x >3 else 1.0,
discontinuities=[3],
color=GREEN,
)

# Axes.get_graph_label可以接受字符串或者mobject。如果傳入的是字符串
# 那么將將其當(dāng)作LaTeX表達式傳入Tex中
# 默認下,label將生成在圖像的右側(cè),并且匹配圖像的顏色
sin_label = axes.get_graph_label(sin_graph,"sin(x)")
relu_label = axes.get_graph_label(relu_graph, Text("ReLU"))
step_label = axes.get_graph_label(step_graph, Text("Step"), x=4)

self.play(
ShowCreation(sin_graph),
FadeIn(sin_label, RIGHT),
)
self.wait(2)
self.play(
ReplacementTransform(sin_graph, relu_graph),
FadeTransform(sin_label, relu_label),
)
self.wait()
self.play(
ReplacementTransform(relu_graph, step_graph),
FadeTransform(relu_label, step_label),
)
self.wait()

parabola = axes.get_graph(lambda x:0.25 * x**2)
parabola.set_stroke(BLUE)
self.play(
FadeOut(step_graph),
FadeOut(step_label),
ShowCreation(parabola)
)
self.wait()

# 你可以使用Axes.input_to_graph_point(縮寫Axes.i2gp)來找到圖像上的一個點
dot = Dot(color=RED)
dot.move_to(axes.i2gp(2, parabola))
self.play(FadeIn(dot, scale=0.5))

# ValueTracker存儲一個數(shù)值,可以幫助我們制作可變參數(shù)的動畫
# 通常使用updater或者f_always讓其它mobject根據(jù)其中的數(shù)值來更新
x_tracker = ValueTracker(2)
f_always(
dot.move_to,
lambda: axes.i2gp(x_tracker.get_value(), parabola)
)

self.play(x_tracker.animate.set_value(4), run_time=3)
self.play(x_tracker.animate.set_value(-2), run_time=3)
self.wait()

如果在運行的時候你出現(xiàn)了這樣的錯誤:

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2723

    瀏覽量

    47607
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4801

    瀏覽量

    84852
  • 3d視圖
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    11010
收藏 人收藏

    評論

    相關(guān)推薦

    [OpenHarmony北向應(yīng)用開發(fā)] 做一個 loading加載動畫

    - 本篇文章介紹了如何實現(xiàn)簡單的loading加載動畫,并且在提供了demo工程供讀者下載學(xué)習(xí)。 - loading加載
    的頭像 發(fā)表于 04-20 11:29 ?1933次閱讀
    [OpenHarmony北向應(yīng)用<b class='flag-5'>開發(fā)</b>] 做<b class='flag-5'>一個</b> loading加載<b class='flag-5'>動畫</b>

    免費的python教程分享

    最近找到了免費的python教程,兩周學(xué)會了python開發(fā)【內(nèi)附學(xué)習(xí)視頻】
    發(fā)表于 07-13 16:17

    使用Python和Flask開發(fā)Web程序

    Flask 是使用 Python 語言編寫的 Web 框架,它可以讓你高效的編寫 Web 程序。Web 程序即“網(wǎng)站”或“網(wǎng)頁程序”,是指可以通過瀏覽器進行交互的程序。我們?nèi)粘J褂脼g覽器訪問
    發(fā)表于 02-28 08:00 ?0次下載

    Logistic回歸數(shù)學(xué)推導(dǎo)以及python實現(xiàn)

    Logistic回歸數(shù)學(xué)推導(dǎo)以及python實現(xiàn)
    發(fā)表于 02-25 14:48 ?7次下載

    Python模塊Addit屬性設(shè)置

    Addit 是Python模塊,除了提供標準的字典語法外,Addit 生成的字典的值既可以使用屬性來獲取,也可以使用屬性進行設(shè)置。 這意味著你 不用 再寫這樣的字典了: body
    的頭像 發(fā)表于 11-17 10:15 ?1414次閱讀

    python包、模塊和庫是什么

    1. 模塊 以 .py 為后綴的文件,我們稱之為 模塊,英文名 Module。 模塊讓你能夠有邏輯地組織你的 Python 代碼段,把相關(guān)的代碼分配到
    的頭像 發(fā)表于 03-09 16:47 ?2346次閱讀

    如何使用Arduino構(gòu)建電子動畫眼睛

    在這個項目中,我們將使用 Arduino 構(gòu)建動畫眼睛。在網(wǎng)上尋找新的項目創(chuàng)意時,我萌生了制作動畫眼睛的想法,這個項目立即引起了我的注意。
    的頭像 發(fā)表于 07-10 09:52 ?2639次閱讀
    如何使用Arduino構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個</b>電子<b class='flag-5'>動畫</b>眼睛

    Python-模塊與包

    模塊Python 程序架構(gòu)的核心概念
    的頭像 發(fā)表于 02-16 14:55 ?794次閱讀
    <b class='flag-5'>Python</b>-<b class='flag-5'>模塊</b>與包

    Python-pygame 游戲開發(fā)

    pygame 就是Python 模塊,專為電子游戲設(shè)計
    的頭像 發(fā)表于 02-16 15:43 ?1508次閱讀
    <b class='flag-5'>Python</b>-pygame 游戲<b class='flag-5'>開發(fā)</b>

    介紹Python模塊的基礎(chǔ)知識

    Python種高級編程語言,擁有豐富的庫和模塊。模塊Python
    的頭像 發(fā)表于 04-21 16:48 ?1008次閱讀

    Python中常見的數(shù)學(xué)運算方法

    Python種面向?qū)ο蟆⒔忉屝?、交互式的高級編程語言。它支持各種數(shù)學(xué)運算,包括基本算術(shù)運算、比較運算、邏輯運算等。
    的頭像 發(fā)表于 04-21 16:51 ?5657次閱讀

    Python中telnetlib模塊的基本使用

    telnetlib 是 Python 標準庫中的模塊,它提供了 Telnet 協(xié)議的客戶端功能。使用 telnetlib 模塊,我們可以
    的頭像 發(fā)表于 05-04 14:27 ?8195次閱讀

    Python 梯度計算模塊如何實現(xiàn)邏輯回歸模型

    AutoGrad 是老少皆宜的 Python 梯度計算模塊。 對于初高中生而言,它可以用來輕易計算條曲線在任意
    的頭像 發(fā)表于 10-21 11:01 ?511次閱讀
    <b class='flag-5'>Python</b> 梯度計算<b class='flag-5'>模塊</b>如何實現(xiàn)<b class='flag-5'>一</b><b class='flag-5'>個</b>邏輯回歸模型

    python如何導(dǎo)入模塊

    Python種強大的編程語言,它支持模塊化編程,使得開發(fā)者可以將代碼分解為可重用且獨立的模塊模塊
    的頭像 發(fā)表于 11-22 14:46 ?981次閱讀

    鴻蒙開發(fā)之發(fā)動畫

    動畫的原理是在一個時間段內(nèi),多次改變UI外觀,由于人眼會產(chǎn)生視覺暫留,所以最終看到的就是“連續(xù)”的動畫。UI的
    的頭像 發(fā)表于 02-01 15:25 ?654次閱讀
    鴻蒙<b class='flag-5'>開發(fā)</b>之發(fā)<b class='flag-5'>動畫</b>篇