manim曲线,除了前面介绍的圆弧类曲线,也可以绘制任意的曲线。

manim中提供的CubicBezier模块,可以利用三次贝塞尔曲线的方式绘制任意曲线。

关于贝塞尔曲线的介绍,可以参考:https://en.wikipedia.org/wiki/B%C3%A9zier_curve

本文主要介绍贝塞尔曲线和两种带箭头的曲线的模块。

  1. CubicBezier:三次贝塞尔曲线,可以绘制平面上的任意曲线
  2. CurvedArrow:单箭头曲线
  3. CurvedDoubleArrow:双箭头曲线

1. 主要参数

CurvedArrowCurvedDoubleArrow的主要参数就是曲线的起点和终点,

这两个模块继承自ArcBetweenPoints模块。

参数名称 类型 说明
start Point3D 起点
end Point3D 终点

CubicBezier模块的参数是四个点,建议先了解三次贝塞尔曲线的原理,然后就能明白这4个参数的意义。

参数名称 类型 说明
start_anchor Point3D 起点
start_handle Point3D 第一个控制点,影响曲线起点到中间部分的弯曲方向
end_handle Point3D 第二个控制点,影响曲线中间部分到终点的弯曲方向
end_anchor Point3D 终点

比如下面的贝塞尔曲线,其中:

  • $ P_0 $相当于参数start_anchor
  • $ P_1

    $相当于参数start_handle
  • $ P_2 $相当于参数end_handle
  • $ P_4 $相当于参数end_anchor

2. 使用示例

2.1. 带箭头的曲线

带箭头的曲线由起点开始沿逆时针方向旋转到终点

CurvedArrow(
LEFT / 2 + UP,
RIGHT / 2 + UP,
color=BLUE,
)
CurvedArrow(
LEFT + UP / 2,
RIGHT + UP / 2,
color=RED,
)
CurvedDoubleArrow(
LEFT * 2 + UP / 2,
RIGHT * 2 + UP / 2,
color=YELLOW,
) CurvedDoubleArrow(
RIGHT * 2 + DOWN * 1.6,
LEFT * 2 + DOWN * 1.6,
color=YELLOW,
)
CurvedArrow(
RIGHT + DOWN * 1.6,
LEFT + DOWN * 1.6,
color=RED,
)
CurvedArrow(
RIGHT / 2 + DOWN * 2.1,
LEFT / 2 + DOWN * 2.1,
color=BLUE,
)

2.2. 贝塞尔曲线绘制过程

贝塞尔曲线通过四个点就能绘制出非常平滑的曲线,其中的原理网络上有很多文章介绍,这里不再赘述。

下面通过一个动画演示其绘制的原理。

  1. 白色的点:用于绘制贝塞尔曲线的4个固定点
  2. 蓝色点:根据4个白色点计算得出
  3. 红色点:根据3个蓝色点计算得出
  4. 黄色点:根据2个红色点计算得出

蓝色点沿着白色点连接的线移动,红色点随蓝色点联动,黄色点随红色点联动,

黄色点的运动轨迹就是绘制出的曲线。

有了CubicBezier模块,可以根据四个点直接绘制贝塞尔曲线,效果和上面的一样,只是代码会简化很多。

points = [
LEFT * 2 + DOWN,
LEFT + UP,
RIGHT * 1.5 + UP,
RIGHT * 2 + DOWN,
] CubicBezier(
points[0],
points[1],
points[2],
points[3],
color=YELLOW,
)

2.3. 绘制爱心

贝塞尔曲线可以绘制非常光滑的曲线,理论上可以绘制各种复杂的曲线图形。

下面尝试用三次贝塞尔曲线来绘制一个爱心的图案。

points = [
2 * DOWN * 0.5,
2 * LEFT,
2 * (LEFT + UP),
2 * UP * 0.5,
]
# 左半部分
CubicBezier(
points[0],
points[1],
points[2],
points[3],
color=RED,
) points = [
2 * DOWN * 0.5,
2 * RIGHT * 1,
2 * (RIGHT * 1 + UP),
2 * UP * 0.5,
]
# 右半部分
CubicBezier(
points[0],
points[1],
points[2],
points[3],
color=GREEN,
)

3. 附件

文中完整的代码放在网盘中了(bezier.py),

下载地址: 完整代码 (访问密码: 6872)

manim边学边做--曲线类的更多相关文章

  1. scratch教程:学做控制类积木

    少儿编程中scratch很容易被小孩所接受,不管是从外观还是教程中,都符合少儿的兴趣,为此现在只要是开少儿编程课都会有scratch课程,今天娜娜姐小码王scratch培训机构就为大家分享,scrat ...

  2. 学EE做硬件找工作不如学CS做软件,为什么会这样?

    学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...

  3. 牛腩学Kotlin做Android应用

    牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...

  4. 基于jQuery适合做图片类网站的特效

    分享一款基于jquery适合做图片类网站的特效.这是一款鼠标经过图片滑动弹出标题效果代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="c ...

  5. php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...

  6. html5-3 html5标签(热点地图如何实现)(边学边做)

    html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl  自定义列表dt  自定义标题dd  自定义列表内容 2. ...

  7. 小白学Java:File类

    目录 小白学Java:File类 不同风格的分隔符 绝对与相对路径 File类常用方法 常用构造器 创建方法 判断方法 获取方法 命名方法 删除方法 小白学Java:File类 我们可以知道,存储在程 ...

  8. 第一份开发工作,边学边做android

    我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...

  9. 编写高质量代码改善C#程序的157个建议[勿选List<T>做基类、迭代器是只读的、慎用集合可写属性]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议23.避免将List<T>作为自定义集合类的基 ...

  10. 快学Scala-第五章 类

    知识点: 1.简单类和无参方法 class Counter { private var value = 0 //必须初始化字段 def increment() { value += 1} //方法默认 ...

随机推荐

  1. VUE商城项目 -商品分类功能 - 手稿

  2. IDEA之调试或运行的小助手日志插件Grep Console:不同颜色区分,查看日志看方便【工欲善其事必先利其器】

    简介 Grep Console是一款方便开发者对idea控制台输出日志进行个性化管理的插件.这个插件还是很用的,在满屏的日志中,迅速找到自己关注的内容,调试程序的绝佳工具. 功能特性 Grep Con ...

  3. 0. 什么是C++

    什么是C++ 是C语言的扩展,有如下的两个特性: 关注性能 与底层硬件紧密结合 对象生命周期精确控制 零成本抽象(Zero-overhead Abstraction) 引入大量利于工程实践的特性 三种 ...

  4. ERP中内部批号和外部批号分别指的是什么

    在企业资源计划(ERP)系统中,内部批号和外部批号是两个用于标识和跟踪产品的关键概念.它们通常用于管理和追踪生产.库存和供应链中的物料. 内部批号(Internal Batch Number): 定义 ...

  5. [oeasy]python0109_tty_打字头_电传打字机_字模_点阵字库

    点阵字库 回忆上次内容 上次回顾了 字符字型 的 进化过程 从 谷腾堡 活字 到 罗马正字 和 意大利斜体   罗马帝国战斗力的征服 和 基督教文化传播 使得 拉丁字符 在日耳曼语地区广泛传播 种葡萄 ...

  6. CF1951

    A link 这个题就是讨论. 首先,如果没有\(1\)就一定可以. 如果有\(1\). 如果长度为\(2\)一定不行. \(1\)的个数为奇数不行. 如果为偶数 有一个小点:如果是\(2\)个\(1 ...

  7. 对比python学julia(第一章)--(第六节)数字黑洞

    6.1. 问题描述 6174数字黑洞是印度数学家卡普雷卡尔于1949年发现的,又称为卡普雷卡尔黑洞,其规则描述如下. 任意取一个4位的整数(4个数字不能完全相同),把4个数字由大到小排列成一个大的数, ...

  8. 【MySQL】java.sql.SQLException: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='

    问题原因参考: http://t.zoukankan.com/zhulei2-p-13451554.html collations 排序规则 Illegal mix 非法混合 SQL报错指出,操作符等 ...

  9. “Vanilla” 在计算机科学和技术领域中的专业翻译

    "Vanilla" 在计算机科学和技术领域中通常指的是某个系统或软件的"原始"或"基础"版本,即没有任何修改.扩展或定制的版本.它可以翻译为 ...

  10. ubuntu22.04下安装nvidia-docker

    首先需要保证docker engine已经安装成功,具体见: https://www.cnblogs.com/devilmaycry812839668/p/17269122.html ======== ...