首页 > 其他分享 >manim边学边做--曲线类

manim边学边做--曲线类

时间:2024-09-04 10:52:15浏览次数:7  
标签:-- 曲线 贝塞尔 UP DOWN points LEFT 边学边 manim

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)

标签:--,曲线,贝塞尔,UP,DOWN,points,LEFT,边学边,manim
From: https://www.cnblogs.com/wang_yb/p/18396028

相关文章

  • Linux 磁盘管理-存储设备及类型介绍(超详细)
    今天给伙伴们分享一下Linux磁盘管理-存储设备及类型介绍,希望看了有所收获。我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!如果伙伴们看了文档觉得有用,欢迎大家关注......
  • 08-基于词项和基于全文的搜索
    DELETEproductsPUTproducts{"settings":{"number_of_shards":1}}POST/products/_bulk{"index":{"_id":1}}{"productID":"XHDK-A-1293-#fJ3","desc":"iPhone&qu......
  • c# DiffPlex介绍
    DiffPlex是一个用于生成文本差异(diffs)和补丁(patches)的.NET库,主要用于比较两个字符串或文件之间的差异。它提供了对行和字符级别的差异检测,并可以生成各种形式的差异报告。下面是DiffPlex的详细用法介绍,包括如何在C#中使用它。1.安装DiffPlex首先,在你的项目中添加Di......
  • Nginx 【limit_conn_zone】指令简介
    【limit_conn_zone】是Nginx中的一个指令,用于限制特定IP地址或IP地址段的并发连接数,这个指令可以帮助我们防止恶意用户通过大量连接来消耗服务器资源,从而保证正常用户的访问速度和体验,本文将详细介绍【limit_conn_zone】指令的使用方法和相关问题解答。一、【limit_conn_zone】指......
  • 一致性哈希(Consistent Hashing)
    基本概念        一致性哈希(ConsistentHashing)是一种特殊的哈希算法,主要用于解决分布式系统中数据分布的问题,尤其是在需要动态添加或移除服务器(节点)的情况下。传统哈希算法在节点变化时可能会导致大部分甚至全部的数据重新分布,这样会导致大量的数据迁移,增加了系统的......
  • 《安装Windows 11 系统详细步骤》
    以下是安装Windows11系统的详细步骤: 准备工作: 1. 检查电脑是否满足Windows11的系统要求,包括处理器、内存、存储、TPM等。2. 备份重要的数据,因为安装过程中可能会导致数据丢失。3. 准备一个8GB或以上容量的U盘,并将其格式化为FAT32格式。4. 从微软官方......
  • 04封装:静态
    静态/*在Java中:同一包内的类:指的是在相同的包(package)中定义的所有类。例如,如果两个类都在com.example包中,它们属于同一包。所有子类:指的是继承自某个类的所有类,无论这些子类位于哪个包中。例如,ClassB是ClassA的子类,不论ClassB是否在com.example包中,它都是ClassA......
  • 2024年最新计算机软件毕业设计选题大全:数百热门选题推荐✅
    博主主页:猫头鹰源码博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作​主要内容:毕业设计(Javaweb项目|小程序|Python|HTML|数据可视化|SSM|SpringBoot|Vue|Jsp|PHP......
  • java并发 共享模型之管程 4.
    1. waitnotify1.小故事原理注:虽然 blocked 和 waiting 状态的线程都在等待,但二者有区别。waiting 状态的线程通常是因为它持有了某个对象的锁,但由于某个条件不满足而被挂起。线程在 waiting 状态中会等待其他线程通过调用 notify() 或 notifyAll() 来通知它......
  • 如何调试VB6 ActiveX EXE
    keywords:debug,调试,vb6,activex,exe要在调试ActiveXEXE工程(工程A)时配合标准EXE工程(工程B),可以按照以下步骤进行设置步骤1:设置ActiveXEXE工程A在工程A中设置调试模式:打开ActiveXEXE工程A。在“项目”菜单中,选择“工程属性”。在“调试”选项卡中,选择“等待组件......