精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

Manim:一個Python數學動畫開發模塊

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

Manim 是3b1b開源的一個特別漂亮的數學動畫模塊。

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

圖片

也支持函數圖像:

圖片

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

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

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

1.準備

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

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

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

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

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

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

圖片

2. Manim 基本使用

首先學會畫一個基本的數學圖形,如圓圈:

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 鍵的同時移動鼠標來改變三維視角
  • 按下鍵盤上 r 鍵恢復到最初的視角

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

接下來,我們學習如何讓圓形變成方形:

# 公眾號: 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: **延時從第一個參數的圖形變化到第二個參數的圖形的過程。

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

終端運行命令:

manimgl 你的py文件名.py CircleToSquare

效果如下:

圖片

再來一個復雜一點的演示,增加拉伸、旋轉和變換:

# 公眾號: 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()
        # 旋轉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的復變換
        self.play(square.animate.apply_complex_function(lambda z: z**2))
        self.wait()

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

**square.animate.shift: **可以調整圖形位置和大小。

square.animate.apply_complex_function: 增加函數復變換。

效果如下:

圖片

3. Manim 坐標軸與函數圖像

想要實現函數圖像繪制,我們需要先添加坐標軸:

# 公眾號: 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設為False
relu_graph = axes.get_graph(
lambda x: max(x,0),
use_smoothing=False,
color=YELLOW,
)
# 對于不連續的函數,你可以指定間斷點來讓它不試圖填補不連續的位置
step_graph = axes.get_graph(
lambda x:2.0 if x >3 else 1.0,
discontinuities=[3],
color=GREEN,
)

# Axes.get_graph_label可以接受字符串或者mobject。如果傳入的是字符串
# 那么將將其當作LaTeX表達式傳入Tex中
# 默認下,label將生成在圖像的右側,并且匹配圖像的顏色
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存儲一個數值,可以幫助我們制作可變參數的動畫
# 通常使用updater或者f_always讓其它mobject根據其中的數值來更新
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()

如果在運行的時候你出現了這樣的錯誤:

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2671

    瀏覽量

    47341
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84453
  • 3d視圖
    +關注

    關注

    0

    文章

    9

    瀏覽量

    10997
收藏 人收藏

    評論

    相關推薦

    [OpenHarmony北向應用開發] 做一個 loading加載動畫

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

    免費的python教程分享

    最近找到了免費的python教程,兩周學會了python開發【內附學習視頻】
    發表于 07-13 16:17

    使用Python和Flask開發Web程序

    Flask 是使用 Python 語言編寫的 Web 框架,它可以讓你高效的編寫 Web 程序。Web 程序即“網站”或“網頁程序”,是指可以通過瀏覽器進行交互的程序。我們日常使用瀏覽器訪問
    發表于 02-28 08:00 ?0次下載

    Logistic回歸數學推導以及python實現

    Logistic回歸數學推導以及python實現
    發表于 02-25 14:48 ?7次下載

    Python模塊Addit屬性設置

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

    python包、模塊和庫是什么

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

    如何使用Arduino構建電子動畫眼睛

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

    Python-模塊與包

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

    Python-pygame 游戲開發

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

    介紹Python模塊的基礎知識

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

    Python中常見的數學運算方法

    Python種面向對象、解釋型、交互式的高級編程語言。它支持各種數學運算,包括基本算術運算、比較運算、邏輯運算等。
    的頭像 發表于 04-21 16:51 ?5576次閱讀

    Python中telnetlib模塊的基本使用

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

    Python 梯度計算模塊如何實現邏輯回歸模型

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

    python如何導入模塊

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

    鴻蒙開發之發動畫

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