manim边学边做--曲线类

news/2024/9/27 21:24:34

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/56424.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

51nod 2842 城际旅行

原题链接这题因为要求满足 t 时间内,所以用 dp ,不过我们的状态比较特殊,\(dp[i][j]\) 表示到 \(i\) 点时经过 \(j\) 个点的最短时间,因为题目为 DAG 所以要用拓扑排序,每到一个点,枚举所有出边,更新出点的状态 \(f[v][j+1]=min(f[v][j+1],f[u][j])\),最后的答案就是所…

adb获取手机电池信息

1、获取手机电池信息adb shell dumpsys battery字段说明Current Battery Service state:AC powered: true #交流供电USB powered: false #usb供电Wireless powered: false #无线供电Max charging current: 75000 #最大充电电流Max charging volt…

在pycharm中使用copilot

一、注册、获取使用权限 什么双密码验证、学生验证的过程就不重复了,按网上的教程来就行。 需要注意的是,Github学生认证通过之后,并不是能够立马使用copilot,得等三天copilot的免费使用权限才会批下来。 二、在pycharm中使用copilot 1、安装插件、登录Github等,按照网上的…

若依项目pom文件添加jar包已依赖报红,dependency not found,提示找不到jar包

原因很简单,因为我写在了父项目的pom文件中,写在了 里面。这里只是对依赖的版本进行管理。点击查看代码<!-- 依赖声明 --><dependencyManagement><dependencies>正确的做法应该是在子项目中的pom文件中引入对应依赖,在父项目的pom文件中填上对应的依赖版…

0 JavaScript高级程序设计(第4版)【JS红宝书】【详细思维导图】【持续更新】

ProcessOn访问链接 JavaScript高级程序设计(第4版)阅读路线图,涵盖:基本知识进阶内容BOM和DOMJavascript APIJavaScript设计模式和实践策略ProcessOn访问链接本文来自博客园,作者:muling9955,转载请注明原文链接:https://www.cnblogs.com/muling-blog/p/18395904

架构师备考的一些思考

前言 之前的python-pytorch的系列文章还没有写完,只是写到卷积神经网络。因为我报名成功了系统架构师的考试,所以决定先备考,等考完再继续写。 虽然架构师证书不能证明技术水平,但在现实生活中的某些情况下是有意义的。考试虽然无聊,但有些考题还是蛮有意思的。 思考 看了…