manim边学边做--曲线类

打印 上一主题 下一主题

主题 860|帖子 860|积分 2580

manim中曲线,除了前面介绍的圆弧类曲线,也可以绘制任意的曲线。
manim中提供的CubicBezier模块,可以使用三次贝塞尔曲线的方式绘制任意曲线。
关于贝塞尔曲线的介绍,可以参考:https://en.wikipedia.org/wiki/B%C3%A9zier_curve
本文主要介绍贝塞尔曲线和两种带箭头的曲线的模块。

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

1. 主要参数

CurvedArrow和CurvedDoubleArrow的主要参数就是曲线的起点和终点,
这两个模块继承自ArcBetweenPoints模块。
参数名称类型说明startPoint3D起点endPoint3D终点CubicBezier模块的参数是四个点,发起先了解三次贝塞尔曲线的原理,然后就能明白这4个参数的意义。
参数名称类型说明start_anchorPoint3D起点start_handlePoint3D第一个控制点,影响曲线起点到中间部分的弯曲方向end_handlePoint3D第二个控制点,影响曲线中间部分到终点的弯曲方向end_anchorPoint3D终点好比下面的贝塞尔曲线,其中:

  • $ P_0 $相当于参数start_anchor
  • $ P_1
    $相当于参数start_handle
  • $ P_2 $相当于参数end_handle
  • $ P_4 $相当于参数end_anchor。

2. 使用示例

2.1. 带箭头的曲线

带箭头的曲线由起点开始沿逆时针方向旋转到终点
  1. CurvedArrow(
  2.     LEFT / 2 + UP,
  3.     RIGHT / 2 + UP,
  4.     color=BLUE,
  5. )
  6. CurvedArrow(
  7.     LEFT + UP / 2,
  8.     RIGHT + UP / 2,
  9.     color=RED,
  10. )
  11. CurvedDoubleArrow(
  12.     LEFT * 2 + UP / 2,
  13.     RIGHT * 2 + UP / 2,
  14.     color=YELLOW,
  15. )
  16. CurvedDoubleArrow(
  17.     RIGHT * 2 + DOWN * 1.6,
  18.     LEFT * 2 + DOWN * 1.6,
  19.     color=YELLOW,
  20. )
  21. CurvedArrow(
  22.     RIGHT + DOWN * 1.6,
  23.     LEFT + DOWN * 1.6,
  24.     color=RED,
  25. )
  26. CurvedArrow(
  27.     RIGHT / 2 + DOWN * 2.1,
  28.     LEFT / 2 + DOWN * 2.1,
  29.     color=BLUE,
  30. )
复制代码

2.2. 贝塞尔曲线绘制过程

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

  • 白色的点:用于绘制贝塞尔曲线的4个固定点
  • 蓝色点:根据4个白色点计算得出
  • 红色点:根据3个蓝色点计算得出
  • 黄色点:根据2个红色点计算得出
蓝色点沿着白色点连接的线移动,红色点随蓝色点联动,黄色点随红色点联动,
黄色点的运动轨迹就是绘制出的曲线。

有了CubicBezier模块,可以根据四个点直接绘制贝塞尔曲线,结果和上面的一样,只是代码会简化许多。
  1. points = [
  2.     LEFT * 2 + DOWN,
  3.     LEFT + UP,
  4.     RIGHT * 1.5 + UP,
  5.     RIGHT * 2 + DOWN,
  6. ]
  7. CubicBezier(
  8.     points[0],
  9.     points[1],
  10.     points[2],
  11.     points[3],
  12.     color=YELLOW,
  13. )
复制代码

2.3. 绘制爱心

贝塞尔曲线可以绘制非常光滑的曲线,理论上可以绘制各种复杂的曲线图形。
下面尝试用三次贝塞尔曲线来绘制一个爱心的图案。
  1. points = [
  2.     2 * DOWN * 0.5,
  3.     2 * LEFT,
  4.     2 * (LEFT + UP),
  5.     2 * UP * 0.5,
  6. ]
  7. # 左半部分
  8. CubicBezier(
  9.     points[0],
  10.     points[1],
  11.     points[2],
  12.     points[3],
  13.     color=RED,
  14. )
  15. points = [
  16.     2 * DOWN * 0.5,
  17.     2 * RIGHT * 1,
  18.     2 * (RIGHT * 1 + UP),
  19.     2 * UP * 0.5,
  20. ]
  21. # 右半部分
  22. CubicBezier(
  23.     points[0],
  24.     points[1],
  25.     points[2],
  26.     points[3],
  27.     color=GREEN,
  28. )
复制代码

3. 附件

文中完整的代码放在网盘中了(bezier.py),
下载地址: 完整代码 (访问暗码: 6872)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表