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)

相关推荐
dbdr0901几秒前
Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十六天
linux·运维·服务器·网络·python·学习
花花无缺5 分钟前
python自动化-pytest-用例发现规则和要求
后端·python
YUELEI11836 分钟前
langchain 提示模版 PromptTemplate
python·langchain
东方不败之鸭梨的测试笔记39 分钟前
LangChain: Models, Prompts 模型和提示词
人工智能·python·langchain
AI Echoes1 小时前
别再手工缝合API了!开源LLMOps神器LMForge,让你像搭积木一样玩转AI智能体!
人工智能·python·langchain·开源·agent
AI Echoes1 小时前
从零构建企业级LLMOps平台:LMForge——支持多模型、可视化编排、知识库与安全审核的全栈解决方案
人工智能·python·langchain·开源·agent
beijingliushao2 小时前
58-正则表达式
数据库·python·mysql·正则表达式
陈敬雷-充电了么-CEO兼CTO2 小时前
具身智能多模态感知与场景理解:融合语言模型的多模态大模型
人工智能·python·gpt·语言模型·自然语言处理·chatgpt·多模态
荔枝吻2 小时前
【AI总结】Python BERT 向量化入门指南
人工智能·python·bert
张子夜 iiii2 小时前
传统神经网络实现-----手写数字识别(MNIST)项目
人工智能·pytorch·python·深度学习·算法