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

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

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

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

科技綠洲 ? 來(lái)源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-17 11:21 ? 次閱讀

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

我們能夠基于Manim繪制許多解釋性的動(dòng)畫,比如下面這個(gè):

圖片

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

圖片

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

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

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

1.準(zhǔn)備

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

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

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

請(qǐng)選擇以下任一種方式輸入命令安裝依賴

  1. Windows 環(huán)境 打開 Cmd (開始-運(yùn)行-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,會(huì)出現(xiàn)如下的界面,說(shuō)明安裝完成。

圖片

2. Manim 基本使用

首先學(xué)會(huì)畫一個(gè)基本的數(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

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

圖片

你還可以操作彈出的這個(gè)窗口:

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

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

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

# 公眾號(hào): Python實(shí)用寶典
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í)從第一個(gè)參數(shù)的圖形變化到第二個(gè)參數(shù)的圖形的過程。

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

終端運(yùn)行命令:

manimgl 你的py文件名.py CircleToSquare

效果如下:

圖片

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

# 公眾號(hào): Python實(shí)用寶典
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()
        # 在向右移動(dòng)2單位同時(shí)縮小為原來(lái)的1/4
        self.play(square.animate.shift(2 * RIGHT), square.animate.scale(0.25))
        self.wait()
        # 為了非線性變換,給square增加10段曲線(不會(huì)播放動(dòng)畫)
        square.insert_n_curves(10)
        # 給square上的所有點(diǎn)施加f(z)=z^2的復(fù)變換
        self.play(square.animate.apply_complex_function(lambda z: z**2))
        self.wait()

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

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

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

效果如下:

圖片

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

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

# 公眾號(hào): Python實(shí)用寶典
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))

運(yùn)行以下命令顯示坐標(biāo)軸:

manimgl 你的py文件名.py GraphExample

圖片

坐標(biāo)軸繪制完成后,就可以開始繪制圖像了:

上滑查看更多代碼

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會(huì)返回傳入方程的圖像
sin_graph = axes.get_graph(
lambda x:2 * math.sin(x),
color=BLUE,
)
# 默認(rèn)情況下,它在所有采樣點(diǎn)(x, f(x))之間稍微平滑地插值
# 但是,如果圖形有棱角,可以將use_smoothing設(shè)為False
relu_graph = axes.get_graph(
lambda x: max(x,0),
use_smoothing=False,
color=YELLOW,
)
# 對(duì)于不連續(xù)的函數(shù),你可以指定間斷點(diǎn)來(lái)讓它不試圖填補(bǔ)不連續(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表達(dá)式傳入Tex中
# 默認(rèn)下,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)來(lái)找到圖像上的一個(gè)點(diǎn)
dot = Dot(color=RED)
dot.move_to(axes.i2gp(2, parabola))
self.play(FadeIn(dot, scale=0.5))

# ValueTracker存儲(chǔ)一個(gè)數(shù)值,可以幫助我們制作可變參數(shù)的動(dòng)畫
# 通常使用updater或者f_always讓其它mobject根據(jù)其中的數(shù)值來(lái)更新
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()

如果在運(yùn)行的時(shí)候你出現(xiàn)了這樣的錯(cuò)誤:

圖片

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

    關(guān)注

    7

    文章

    2630

    瀏覽量

    47221
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

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

    關(guān)注

    0

    文章

    9

    瀏覽量

    10990
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    個(gè)免費(fèi)的python教程分享

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

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

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

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

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

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

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

    python包、模塊和庫(kù)是什么

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

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

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

    Python-模塊與包

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

    Python-pygame 游戲開發(fā)

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

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

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

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

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

    Python中telnetlib模塊的基本使用

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

    Python 梯度計(jì)算模塊如何實(shí)現(xiàn)個(gè)邏輯回歸模型

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

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

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

    鴻蒙開發(fā)之發(fā)動(dòng)畫

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