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

Manim库中的ParametricFunction类正是为此而生,它允许用户通过参数方程创建各种复杂的二维和三维曲线。

ParametricFunction的核心作用是将数学参数方程转换为可视化的曲线。与普通函数不同,参数方程使用独立参数t表示曲线上点的坐标:

x = f(t)
y = g(t)
z = h(t)

典型应用场景包括:

  • 绘制无法用$ 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曲线的能力。

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参数,可以正确地绘制不连续函数的图形,这对于展示数学函数的不连续点非常有用。

# 定义不连续函数
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. 跳动的心形线

这个浪漫的示例展示了如何创建复杂的心形图案,并通过缩放动画赋予其"跳动"效果。

# 心形线参数方程
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)

manim边做边学--参数化曲线的更多相关文章

  1. 边做边学入门微信小程序之仿豆瓣评分

    微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...

  2. Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain

    近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...

  3. 【Leetcode 做题学算法周刊】第四期

    首发于微信公众号<前端成长记>,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67 ...

  4. 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good

    作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...

  5. 做fzu oj 1045 做减法学到的sprintf()函数

    题目 做题一直输不出答案,于是就上网去百度了这题的解题,发现解答十分的简短,而且其中我看见了平时没见过的函数,sprintf(). 于是就百度sprintf()的使用. 如下: 函数功能:把格式化的数 ...

  6. Tween 若干年后我尽然还要学数学 曲线到底是什么鬼啊

    var Tween = { linear: function (t, b, c, d){ //匀速 return c*t/d + b; }, easeIn: function(t, b, c, d){ ...

  7. 【Leetcode 做题学算法周刊】第一期

    首发于微信公众号<前端成长记>,写于 2019.10.28 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 1. ...

  8. 【Leetcode 做题学算法周刊】第二期

    首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...

  9. 【Leetcode 做题学算法周刊】第三期

    首发于微信公众号<前端成长记>,写于 2019.11.13 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 35 ...

  10. 【Leetcode 做题学算法周刊】第六期

    首发于微信公众号<前端成长记>,写于 2019.12.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 11 ...

随机推荐

  1. cypress 在 typescript 项目中报错找不到 'tslib'

    原文链接:https://blog.jijian.link/2020-08-11/cypress-typescript-cannot-find-module-tslib/ cypress 在 type ...

  2. k8s Error: failed to prepare subPath for volumeMount "custom-logo" of container "grafana"

    前言 使用 k8s 挂载卷文件时,使用了 hostPath,type: File volumeMounts: - mountPath: /usr/share/grafana/public/img/gr ...

  3. laradock 更改 mysql 版本

    # 修改 .env 文件 MYSQL_VERSION=5.7 # 默认为 latest #停止mysql容器 docker-compose stop mysql # 删除旧数据库数据 rm -rf ~ ...

  4. Java24你发任你发,我用Java8

    大家好,我是晓凡. 各位 Java 开发者们!是不是还在为 Java 23 的新特性忙得焦头烂额? 别急,Java 24 已经悄咪咪地发布了! 这可是自 Java 21 以来的第三个非长期支持版本,而 ...

  5. 什么是HTTP压缩及HTTP压缩的过程

    HTTP压缩是指: Web服务器和浏览器之间压缩传输的"文本内容"的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少 ...

  6. 1001: 【编程入门】A+B 输入输出练习I

    1001: [编程入门]A+B 输入输出练习I[https://www.cyccfoj.com/problem.php?id=1001] ''' 题目描述 你的任务是计算a+b.这是为了acm初学者专 ...

  7. 张高兴的大模型开发实战:(四)使用 LangGraph 实现多智能体应用

    目录 环境搭建与配置 定义智能体 加载模型 提取关键词 生成回答 连接智能体 定义图的状态 定义节点方法 根据指令路由 生成回答 文件处理 提取关键词 网络搜索 定义图的结构 运行图 运行指南 在控制 ...

  8. 一文彻底搞懂 MCP:AI 大模型的标准化工具箱

    MCP 最近在 AI 领域 引发了 广泛关注,特别是在 海外各大社区 中,大家热烈讨论,热度 相当高. 我打开了 Google Trends,这是一个专门用于查看全球热点趋势的网站. 输入关键词后,可 ...

  9. 🎀springboot banner介绍及使用

    简介 Banner是指应用程序启动时显示的信息.对于Spring Boot应用来说,默认情况下,当你启动一个 Spring Boot应用时,控制台上会打印出一段由 Spring Boot自带的ASCI ...

  10. Quartz.Net定时任务

    参照: [项目升级]集成Quartz.Net Job实现(一) - 腾讯云开发者社区-腾讯云 (tencent.com) Quartz分布式任务调度 - 掘金 (juejin.cn) 基本概念: Qu ...