在数学可视化领域,参数方程提供了一种灵活描述曲线的方式。
Manim
库中的ParametricFunction
类正是为此而生,它允许用户通过参数方程创建各种复杂的二维和三维曲线。
ParametricFunction
的核心作用是将数学参数方程转换为可视化的曲线。与普通函数不同,参数方程使用独立参数t
表示曲线上点的坐标:
python
x = f(t)
y = g(t)
z = h(t)
其典型应用场景包括:
- 绘制无法用 <math xmlns="http://www.w3.org/1998/Math/MathML"> y = f ( x ) y=f(x) </math>y=f(x)显式表示的曲线(如圆 、椭圆)
- 创建随时间变化的动态轨迹
- 可视化三维空间曲线(如螺旋线)
- 实现复杂的几何图案(如心形线 、星形线)
本文将详细介绍ParametricFunction
的作用、主要参数和方法,并通过动画示例来展示其强大的功能。
1. 主要参数
ParametricFunction
主要参数有:
参数 | 类型 | 说明 | 默认值 |
---|---|---|---|
function |
Callable | 参数方程函数,接收t返回[x,y,z] | 必填 |
t_range |
Sequence[float] | 参数范围[start, end, step] | [0,1,0.1] |
dt |
float | 计算导数的微小增量 | 0.01 |
use_smoothing |
bool | 是否使用平滑算法 | True |
discontinuities |
list[float] | 函数不连续点列表 | None |
color |
颜色常量 | 曲线颜色 | WHITE |
stroke_width |
float | 线宽 | 2.0 |
其中function
参数是一个可调用的函数,形式为(lambda t: (x(t), y(t), z(t)))
。
它定义了曲线的参数化形式,t
是参数,x(t)
、y(t)
和z(t)
分别是x
、y
和z
坐标随参数t
的变化函数。
2. 主要方法
ParametricFunction
主要方法包括:
名称 | 说明 |
---|---|
get_point_from_function | 获取参数t对应的曲线点坐标 |
get_function | 返回参数方程函数 |
get_t_range | 返回参数范围 |
3. 使用示例
下面通过几个典型的例子来演示如何使用ParametricFunction
类。
3.1. 三维螺旋线
这个示例通过引入z轴 参数,我们创建了一个优美的三维螺旋结构,展示ParametricFunction
处理3D曲线的能力。
python
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. 处理不连续函数
这个示例展示了如何处理不连续函数。
通过指定discontinuities
参数,可以正确地绘制不连续函数的图形,这对于展示数学函数的不连续点非常有用。
python
# 定义不连续函数
def discontinuous_func(t):
if t in [-2, 2]:
return (t, 0, 0) # 在不连续点返回一个默认值
return (t, (t**2 - 2) / (t**2 - 4), 0)
# 创建 ParametricFunction 对象
func = (
ParametricFunction(
discontinuous_func,
t_range=(-3, 3),
discontinuities=[-2, 2], # 指定不连续点
dt=0.1, # 不连续点的容差
color=GREEN,
)
.scale(0.5)
.shift(DOWN)
)
# 添加到场景中
self.play(Create(func))

3.3. 跳动的心形线
这个浪漫的示例展示了如何创建复杂的心形图案,并通过缩放动画赋予其**"跳动"**效果。
python
# 心形线参数方程
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. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(parametric_function.py
),
下载地址: 完整代码 (访问密码: 6872)