manim边做边学--参数化曲线
在数学可视化领域,参数方程提供了一种灵活描述曲线的方式。
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)分别是x、y和z坐标随参数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边做边学--参数化曲线的更多相关文章
- 边做边学入门微信小程序之仿豆瓣评分
微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...
- Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain
近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...
- 【Leetcode 做题学算法周刊】第四期
首发于微信公众号<前端成长记>,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67 ...
- 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...
- 做fzu oj 1045 做减法学到的sprintf()函数
题目 做题一直输不出答案,于是就上网去百度了这题的解题,发现解答十分的简短,而且其中我看见了平时没见过的函数,sprintf(). 于是就百度sprintf()的使用. 如下: 函数功能:把格式化的数 ...
- Tween 若干年后我尽然还要学数学 曲线到底是什么鬼啊
var Tween = { linear: function (t, b, c, d){ //匀速 return c*t/d + b; }, easeIn: function(t, b, c, d){ ...
- 【Leetcode 做题学算法周刊】第一期
首发于微信公众号<前端成长记>,写于 2019.10.28 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 1. ...
- 【Leetcode 做题学算法周刊】第二期
首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...
- 【Leetcode 做题学算法周刊】第三期
首发于微信公众号<前端成长记>,写于 2019.11.13 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 35 ...
- 【Leetcode 做题学算法周刊】第六期
首发于微信公众号<前端成长记>,写于 2019.12.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 11 ...
随机推荐
- node_modules/@umijs/runtime" does not exist in container.
使用 umi 脚手架搭建项目,启动时报错 node_modules/@umijs/runtime" does not exist in container. 出现问题 .umi 是临时文件夹 ...
- [SDR] GNU Radio 系列教程 —— GNU Radio RX PDU (接收据包操作)的基础知识(超全)
目录 1 接收概述 2 相关块介绍 2.1 相关性估计器(Correlation Estimator) 2.2 多相时钟同步(Polyphase Clock Sync) 2.3 线性均衡器(Linea ...
- Linux下配置系统ipv6环境
一:检查Linux是否已经开启ipv6 1.使用 ifconfig 查看自己的IP地址是否含有IPv6地址. inet6 addr: fe80::213:d4f*:****:****/64 Scope ...
- 解密prompt系列52. 闲聊大模型还有什么值得探索的领域
在DeepSeek-R1的开源狂欢之后,感觉不少朋友都陷入了技术舒适区,但其实当前的大模型技术只是跨进了应用阶段,可以探索的领域还有不少,所以这一章咱不聊论文了,偶尔不脚踏实地,单纯仰望天空,聊聊还有 ...
- Flutter 2025 年产品路线图发布
每一年 Google Flutter 团队都会发布一份产品路线图,包括 Flutter 框架和 Dart 编程语言,让开发者能够了解官方团队的优先事项,并据此做出自己的计划安排. 产品路线图也会随着客 ...
- ReadWriteLock:读写锁
一. /* * 1. ReadWriteLock : 读写锁 * * 写写/读写 需要"互斥" * 读读 不需要互斥 * */ public class TestReadWrite ...
- 在 ASP.NET Core 中编写高性能 Web API 的4个小技巧
Web API 通常用来与外部模块进行通信.发送和接收数据,作为后端开发人员,应该把写出高性能的应用作为目标. 下面 4 个技巧是我在编写 Web API 的小技巧. 1 .大量数据使用分页查询 接口 ...
- DPDI(Dispatch PDI)kettle调度管理平台之介入前后的对比剖析
DPDI(Dispatch PDI)kettle调度管理平台 --介入前后的对比剖析 引言 在数据处理领域,Kettle(Pentaho Data Integration)作为一款广受欢迎的开源ETL ...
- test-同步111
视频如何拍? 旅拍技巧 旅拍微电影必拍内容 只要用这个思路,用手机拍也可以,只是相机效果更好一些. #小雨朵 #摄影教学 #旅行vlog #川西美景 #把生活拍成电影 - 抖音 (douyin.com ...
- 访问项目resource/static目录下的模板文件(解决Docker部署后访问不到的问题)
使用ClassPathResource方式获取static下的文件(别的方式本地可以访问到,Docker部署后不行) final String templatePath = "/static ...