manim邊做邊學(xué)--參數(shù)化曲線
在數(shù)學(xué)可視化領(lǐng)域,參數(shù)方程提供了一種靈活描述曲線的方式。
Manim庫中的ParametricFunction類正是為此而生,它允許用戶通過參數(shù)方程創(chuàng)建各種復(fù)雜的二維和三維曲線。
ParametricFunction的核心作用是將數(shù)學(xué)參數(shù)方程轉(zhuǎn)換為可視化的曲線。與普通函數(shù)不同,參數(shù)方程使用獨(dú)立參數(shù)t表示曲線上點(diǎn)的坐標(biāo):
x = f(t)
y = g(t)
z = h(t)
其典型應(yīng)用場景包括:
- 繪制無法用$ y=f(x) $顯式表示的曲線(如圓、橢圓)
- 創(chuàng)建隨時(shí)間變化的動(dòng)態(tài)軌跡
- 可視化三維空間曲線(如螺旋線)
- 實(shí)現(xiàn)復(fù)雜的幾何圖案(如心形線、星形線)
本文將詳細(xì)介紹ParametricFunction的作用、主要參數(shù)和方法,并通過動(dòng)畫示例來展示其強(qiáng)大的功能。
1. 主要參數(shù)
ParametricFunction主要參數(shù)有:
| 參數(shù) | 類型 | 說明 | 默認(rèn)值 |
|---|---|---|---|
function |
Callable | 參數(shù)方程函數(shù),接收t返回[x,y,z] | 必填 |
t_range |
Sequence[float] | 參數(shù)范圍[start, end, step] | [0,1,0.1] |
dt |
float | 計(jì)算導(dǎo)數(shù)的微小增量 | 0.01 |
use_smoothing |
bool | 是否使用平滑算法 | True |
discontinuities |
list[float] | 函數(shù)不連續(xù)點(diǎn)列表 | None |
color |
顏色常量 | 曲線顏色 | WHITE |
stroke_width |
float | 線寬 | 2.0 |
其中function參數(shù)是一個(gè)可調(diào)用的函數(shù),形式為(lambda t: (x(t), y(t), z(t)))。
它定義了曲線的參數(shù)化形式,t是參數(shù),x(t)、y(t)和z(t)分別是x、y和z坐標(biāo)隨參數(shù)t的變化函數(shù)。
2. 主要方法
ParametricFunction主要方法包括:
| 名稱 | 說明 |
|---|---|
| get_point_from_function | 獲取參數(shù)t對應(yīng)的曲線點(diǎn)坐標(biāo) |
| get_function | 返回參數(shù)方程函數(shù) |
| get_t_range | 返回參數(shù)范圍 |
3. 使用示例
下面通過幾個(gè)典型的例子來演示如何使用ParametricFunction類。
3.1. 三維螺旋線
這個(gè)示例通過引入z軸參數(shù),我們創(chuàng)建了一個(gè)優(yōu)美的三維螺旋結(jié)構(gòu),展示ParametricFunction處理3D曲線的能力。
self.set_camera_orientation(phi=80 * DEGREES, theta=-60 * DEGREES)
curve = ParametricFunction(
lambda u: (1.2 * np.cos(u), 1.2 * np.sin(u), u * 0.05),
color=RED,
t_range=(-3 * TAU, 5 * TAU, 0.01),
).set_shade_in_3d(True)
axes = ThreeDAxes(x_length=6, y_length=5, z_length=4)
self.add(axes, curve)
self.play(Create(curve))

3.2. 處理不連續(xù)函數(shù)
這個(gè)示例展示了如何處理不連續(xù)函數(shù)。
通過指定discontinuities參數(shù),可以正確地繪制不連續(xù)函數(shù)的圖形,這對于展示數(shù)學(xué)函數(shù)的不連續(xù)點(diǎn)非常有用。
# 定義不連續(xù)函數(shù)
def discontinuous_func(t):
if t in [-2, 2]:
return (t, 0, 0) # 在不連續(xù)點(diǎn)返回一個(gè)默認(rèn)值
return (t, (t**2 - 2) / (t**2 - 4), 0)
# 創(chuàng)建 ParametricFunction 對象
func = (
ParametricFunction(
discontinuous_func,
t_range=(-3, 3),
discontinuities=[-2, 2], # 指定不連續(xù)點(diǎn)
dt=0.1, # 不連續(xù)點(diǎn)的容差
color=GREEN,
)
.scale(0.5)
.shift(DOWN)
)
# 添加到場景中
self.play(Create(func))

3.3. 跳動(dòng)的心形線
這個(gè)浪漫的示例展示了如何創(chuàng)建復(fù)雜的心形圖案,并通過縮放動(dòng)畫賦予其"跳動(dòng)"效果。
# 心形線參數(shù)方程
heart = (
ParametricFunction(
lambda t: np.array(
[
16 * np.sin(t) ** 3,
13 * np.cos(t)
- 5 * np.cos(2 * t)
- 2 * np.cos(3 * t)
- np.cos(4 * t),
0,
]
),
t_range=[0, TAU, 0.01],
color=PINK,
)
.scale(0.1)
.shift(UP * 2)
)
self.play(Create(heart, run_time=2))
self.play(heart.animate.scale(1.2), rate_func=there_and_back)
self.play(heart.animate.scale(1.5), rate_func=there_and_back)
self.play(heart.animate.scale(1.2), rate_func=there_and_back)

4. 附件
文中的代碼只是關(guān)鍵部分的截取,完整的代碼共享在網(wǎng)盤中(parametric_function.py),
下載地址: 完整代碼 (訪問密碼: 6872)

浙公網(wǎng)安備 33010602011771號