找回密码
 立即注册
首页 业界区 业界 manim边做边学--参数化曲线

manim边做边学--参数化曲线

哈妙思 前天 08:32
在数学可视化领域,参数方程提供了一种灵活描述曲线的方式。
Manim库中的ParametricFunction类正是为此而生,它允许用户通过参数方程创建各种复杂的二维和三维曲线。
ParametricFunction的核心作用是将数学参数方程转换为可视化的曲线。与普通函数不同,参数方程使用独立参数t表示曲线上点的坐标:
  1. x = f(t)
  2. y = g(t)
  3. z = h(t)
复制代码
典型应用场景包括:

  • 绘制无法用$ y=f(x) $显式表示的曲线(如椭圆
  • 创建随时间变化的动态轨迹
  • 可视化三维空间曲线(如螺旋线
  • 实现复杂的几何图案(如心形线星形线
本文将详细介绍ParametricFunction的作用、主要参数和方法,并通过动画示例来展示其强大的功能。
1. 主要参数

ParametricFunction主要参数有:
参数类型说明默认值functionCallable参数方程函数,接收t返回[x,y,z]必填t_rangeSequence[float]参数范围[start, end, step][0,1,0.1]dtfloat计算导数的微小增量0.01use_smoothingbool是否使用平滑算法Truediscontinuitieslist[float]函数不连续点列表Nonecolor颜色常量曲线颜色WHITEstroke_widthfloat线宽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曲线的能力。
  1. self.set_camera_orientation(phi=80 * DEGREES, theta=-60 * DEGREES)
  2. curve = ParametricFunction(
  3.     lambda u: (1.2 * np.cos(u), 1.2 * np.sin(u), u * 0.05),
  4.     color=RED,
  5.     t_range=(-3 * TAU, 5 * TAU, 0.01),
  6. ).set_shade_in_3d(True)
  7. axes = ThreeDAxes(x_length=6, y_length=5, z_length=4)
  8. self.add(axes, curve)
  9. self.play(Create(curve))
复制代码
1.gif

3.2. 处理不连续函数

这个示例展示了如何处理不连续函数。
通过指定discontinuities参数,可以正确地绘制不连续函数的图形,这对于展示数学函数的不连续点非常有用。
  1. # 定义不连续函数
  2. def discontinuous_func(t):
  3.     if t in [-2, 2]:
  4.         return (t, 0, 0)  # 在不连续点返回一个默认值
  5.     return (t, (t**2 - 2) / (t**2 - 4), 0)
  6. # 创建 ParametricFunction 对象
  7. func = (
  8.     ParametricFunction(
  9.         discontinuous_func,
  10.         t_range=(-3, 3),
  11.         discontinuities=[-2, 2],  # 指定不连续点
  12.         dt=0.1,  # 不连续点的容差
  13.         color=GREEN,
  14.     )
  15.     .scale(0.5)
  16.     .shift(DOWN)
  17. )
  18. # 添加到场景中
  19. self.play(Create(func))
复制代码
2.gif

3.3. 跳动的心形线

这个浪漫的示例展示了如何创建复杂的心形图案,并通过缩放动画赋予其"跳动"效果。
  1. # 心形线参数方程
  2. heart = (
  3.     ParametricFunction(
  4.         lambda t: np.array(
  5.             [
  6.                 16 * np.sin(t) ** 3,
  7.                 13 * np.cos(t)
  8.                 - 5 * np.cos(2 * t)
  9.                 - 2 * np.cos(3 * t)
  10.                 - np.cos(4 * t),
  11.                 0,
  12.             ]
  13.         ),
  14.         t_range=[0, TAU, 0.01],
  15.         color=PINK,
  16.     )
  17.     .scale(0.1)
  18.     .shift(UP * 2)
  19. )
  20. self.play(Create(heart, run_time=2))
  21. self.play(heart.animate.scale(1.2), rate_func=there_and_back)
  22. self.play(heart.animate.scale(1.5), rate_func=there_and_back)
  23. self.play(heart.animate.scale(1.2), rate_func=there_and_back)
复制代码
3.gif

4. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(parametric_function.py),
下载地址: 完整代码 (访问密码: 6872)

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册