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

在数学可视化领域,参数方程提供了一种灵活描述曲线的方式。

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)分别是xyz坐标随参数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)

相关推荐
郭庆汝3 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
思则变6 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络7 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find8 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取9 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector11 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习11 小时前
Python入门Day2
开发语言·python
Vertira11 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉11 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗11 小时前
黑马python(二十四)
开发语言·python