您的位置:首頁 > 軟件教程 > 教程 > manim邊學(xué)邊做--MathTex

manim邊學(xué)邊做--MathTex

來源:好特整理 | 時(shí)間:2024-06-28 09:30:42 | 閱讀:158 |  標(biāo)簽: T   | 分享到:

上一篇介紹的SingleStringMathTex主要用來顯示只有一行的數(shù)學(xué)公式,對(duì)于復(fù)雜的數(shù)學(xué)公式,可以使用MathTex類。 MathTex類繼承自SingleStringMathTex,在其基礎(chǔ)之上增加了更多的功能。其實(shí),MathTex是制作數(shù)學(xué)動(dòng)畫時(shí)常用的類,反而SingleStringMa

上一篇介紹的 SingleStringMathTex 主要用來顯示只有一行的數(shù)學(xué)公式,
對(duì)于復(fù)雜的數(shù)學(xué)公式,可以使用 MathTex 類。

MathTex 類繼承自 SingleStringMathTex ,在其基礎(chǔ)之上增加了更多的功能。
其實(shí), MathTex 是制作數(shù)學(xué)動(dòng)畫時(shí)常用的類,反而 SingleStringMathTex 用的不多。
manim邊學(xué)邊做--MathTex
MathTex manim 各個(gè)模塊中的位置大致如上圖中所示。

1. 主要參數(shù)

MathTex 的主要參數(shù)有:

參數(shù)名稱 類型 說明
tex_strings list 多個(gè)latex格式的公式
arg_separator string 多個(gè)公式之間的間隔
substrings_to_isolate list 將公式中分離成一個(gè)個(gè)小部分
tex_to_color_map dict 公式中不同部分的顏色設(shè)置
tex_environment str 不熟悉latex的話不要設(shè)置

2. 主要方法

MathTex 繼承了 SingleStringMathTex 之后,擴(kuò)展了不少新的方法,可以更好的控制和展示數(shù)學(xué)公式。

名稱 說明
get_part_by_tex 獲取 latex公式 中的一部分
get_parts_by_tex 獲取 latex公式 中的多個(gè)部分
index_of_part 公式的某部分在整個(gè)公式中的索引
index_of_part_by_tex 某個(gè)tex string在整個(gè)公式中的索引
set_color_by_tex 根據(jù)某個(gè) tex string 設(shè)置顏色
set_color_by_tex_to_color_map 用字典的形式設(shè)置多個(gè) tex string 的顏色
set_opacity_by_tex 根據(jù)某個(gè) tex string 設(shè)置透明度
sort_alphabetically 按字母順序排列 latex公式 中的各個(gè)部分

MathTex 的大部分方法都要配合 substrings_to_isolate 參數(shù)來一起使用,
通過 substrings_to_isolate 將完整的數(shù)學(xué)公式劃分成一個(gè)個(gè)小部分,然后設(shè)置不同的樣式。

3. 使用示例

下面的使用示例,大部分是結(jié)合 參數(shù) 方法 一起使用的。

3.1. 公式之間的間隔

MathTex 支持輸入多個(gè)公式,多個(gè)公式之間默認(rèn)是空格分隔,可以通過 arg_separator 參數(shù)設(shè)置不同的分隔。

tex = MathTex("z", "=", 
              "\sqrt{x^2+y^2}")
tex = MathTex("z", "=", 
              "\sqrt{x^2+y^2}", 
              arg_separator="\quad")

\quad 表示設(shè)置4個(gè)空格。
manim邊學(xué)邊做--MathTex

3.2. 拆分公式

拆分公式非常有用,拆分之后,可以對(duì)公式的一部分進(jìn)行操作.
比如設(shè)置顏色,透明度,甚至可以在公式的不同部分應(yīng)用不同的動(dòng)畫,做出更酷炫的展現(xiàn)形式。

默認(rèn)情況下,公式是一個(gè)整體,哪怕用公式中的一個(gè)字符去獲取,也會(huì)得到整個(gè)公式。

tex = MathTex("z=\sqrt{x^2+y^2}")
print(f"{len(tex) =}")
## 輸出結(jié)果:
# len(tex) =1

part = tex.get_part_by_tex("x")
print(f"{part = }")
## 輸出結(jié)果:
# part = SingleStringMathTex('z=\\sqrt{x^2+y^2}')

所以,先使用 substrings_to_isolate 參數(shù)拆分公式,
然后就可以使用 get_part_by_tex , get_parts_by_tex 這些函數(shù)來獲取公式的不同部分。

tex = MathTex("y=ax^2+bx+c", 
              substrings_to_isolate=["x", "y"])
print(f"{len(tex) =}")
## 輸出結(jié)果:
# len(tex) =6

part = tex.get_part_by_tex("y")
print(f"{part = }")
## 輸出結(jié)果:
# part = SingleStringMathTex('y')

parts = tex.get_parts_by_tex("x")
print(f"{parts = }")
## 輸出結(jié)果:
# parts = VGroup(SingleStringMathTex('x'), 
#                SingleStringMathTex('x'))

從上面的示例中看出,對(duì)于公式 \(y=ax^2+bx+c\) ,按 \(x,y\) 分割之后,
整個(gè)公式被分成了6份,所以 len(tex)=6 ,分成了:

  1. \(y\)
  2. \(=a\)
  3. \(x\)
  4. \(^2+b\)
  5. \(x\)
  6. \(+c\)

也就是說, substrings_to_isolate 中指定的 \(x,y\) 作為了整個(gè)公式的分割點(diǎn)。

tex.get_part_by_tex("y") 得到的是包含 \(y\) 的那部分公式,因?yàn)? \(y\) substrings_to_isolate 中,
所以上面示例中返回的是 part = SingleStringMathTex('y') 。
如果是 tex.get_part_by_tex("a") 的話,返回的將是 part = SingleStringMathTex('=a') 。

上面分成的6個(gè)部分中,有兩個(gè)部分包含 \(x\)
所以 parts = tex.get_parts_by_tex("x") 返回的 VGroup 包含兩個(gè)元素。

通過 index_of_part , index_of_part_by_tex 可以根據(jù)索引來獲取公式被分割的各個(gè)部分。

tex = MathTex("y=ax^2+bx+c", 
              substrings_to_isolate=["x", "y"])

part = tex.get_part_by_tex("b")
print(tex.index_of_part(part))
## 輸出結(jié)果
# 3

print(tex.index_of_part_by_tex("b"))
## 輸出結(jié)果
# 3

在分成的6個(gè)部分中, \(b\) 所在的部分是 第4個(gè) , index 是從 0 開始的,所以示例中輸出結(jié)果為 3 。

之所以要拆分公式,就是為了對(duì)不同的部分進(jìn)行不同的操作,下面的示例樣式拆分之后帶來的應(yīng)用。

3.3. 公式著色

使用拆分前,雖然也可以通過 color 屬性給公式著色,但是只能給整個(gè)公式設(shè)置一個(gè)顏色:

tex = MathTex(
    "z=\sqrt{x^2+y^2}",
    color=RED,
)

拆分之后,可以通過 set_color_by_tex 給不同的部分設(shè)置不同的顏色:

tex = MathTex("z", "=", "\sqrt{x^2+y^2}", 
              substrings_to_isolate=["x", "y", "z"])
tex.set_color_by_tex("x", RED)
tex.set_color_by_tex("y", GREEN)
tex.set_color_by_tex("z", BLUE)

同時(shí)設(shè)置多個(gè)顏色,也可以用 set_color_by_tex_to_color_map 方法:

tex.set_color_by_tex_to_color_map({
    "x": BLUE, "y": RED, "z": GREEN
})

上面三種方式著色后的效果如下:
manim邊學(xué)邊做--MathTex

3.4. 透明度設(shè)置

除了顏色,拆分之后,也可以給不同的部分設(shè)置透明度。

tex = MathTex(
    "z",
    "=",
    "\sqrt{x^2+y^2}",
    substrings_to_isolate=["x", "y", "z"],
)
tex.set_opacity_by_tex("x", 0.4)
tex.set_opacity_by_tex("y", 0.4)
tex.set_opacity_by_tex("z", 0.6)
tex.set_color_by_tex_to_color_map({
    "x": BLUE, "y": RED, "z": GREEN
})

\(x,y,z\) 方別設(shè)置的不同的透明度和顏色,和未設(shè)置透明度時(shí)的對(duì)比如下:
manim邊學(xué)邊做--MathTex

3.5. 排序

最后這個(gè)是排序功能,是將數(shù)學(xué)公式的各個(gè)部分按照 ASCII 碼的順序排序。
比如,排序前(正常的公式從左到右的順序排列各個(gè)部分):

tex = MathTex("c>a>b", 
              substrings_to_isolate=["a", "b", "c"])

for i in range(len(tex)):
    print(tex[i])

## 輸出結(jié)果:
# SingleStringMathTex('c')
# SingleStringMathTex('>')
# SingleStringMathTex('a')
# SingleStringMathTex('>')
# SingleStringMathTex('b')

排序后:

tex.sort_alphabetically()
for i in range(len(tex)):
    print(tex[i])

## 輸出結(jié)果:
# SingleStringMathTex('>')
# SingleStringMathTex('>')
# SingleStringMathTex('a')
# SingleStringMathTex('b')
# SingleStringMathTex('c')

按照 ASCII 碼的順序重新排列了各個(gè)部分。

這樣排列有什么用呢?通過動(dòng)畫來顯示公式時(shí),渲染的順序不一樣。
排序前,從左到右一次顯示 c, >, a, >, b ;
排序后,顯示順序?yàn)樽優(yōu)? >, >, a, b, c
manim邊學(xué)邊做--MathTex

4. 附件

文中完整的代碼放在網(wǎng)盤中了( math_tex.py ),
下載地址: 完整代碼 (訪問密碼: 6872)

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號(hào)!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]

湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)