这一篇让你彻底搞懂贝塞尔曲线

简介: 贝塞尔曲线不懂画?不知道怎么回事?看这一篇就够了!用图形,点曲线运动图和公式推导,让你彻底搞懂贝塞尔曲线的运行原理!

贝塞尔曲线介绍

我们在前面讲了绘制自定义曲线,而实际开发过程还会遇到更复杂的图形绘制,比如下面的这些图形:
image.png
这时候就需要用到贝塞尔曲线了。下面是百科关于贝塞尔曲线的介绍。

贝塞尔曲线就是这样的一条曲线,它是依据四个位置任意的点坐标绘制出的一条光滑曲线。在历史上,研究贝塞尔曲线的人最初是按照已知曲线参数方程来确定四个点的思路设计出这种矢量曲线绘制法。贝塞尔曲线的有趣之处更在于它的“皮筋效应”,也就是说,随着点有规律地移动,曲线将产生皮筋伸引一样的变换,带来视觉上的冲击。1962年,法国数学家 Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名是为贝塞尔曲线。

这上面的介绍实际有点不太正确,三次贝塞尔曲线才需要4个点,而还有一次贝塞尔曲线(实际是线段),二次次贝塞尔曲线以及高阶贝塞尔曲线,只是我们常用的是三次贝塞尔曲线。要理解贝塞尔曲线怎么来的还得从1次贝塞尔曲线和2次贝塞尔曲线说起。

一次贝塞尔曲线

image.png

如上图所示,P 点随时间 t 在 P0到 P1两点之间的线段移动,t=0时刻,P 点和 P0重合,t=1时刻 P 点和 P1重合。最终推导得到 P 点的位置和 P0,P1及 t 的关系是一个线性插值函数:
image.png

二次贝塞尔取曲线

二次贝塞尔曲线控制点有3个,如下图所示。

image.png

一共有 P0、P1和 P2三个控制点,那P 点的位置怎么来的呢?其实P 点是 A 点到 B 点的一次贝塞尔曲线,而 A 点是 P0到 P1的一次贝塞尔曲线,B 点是 P1到 P2的一次贝塞尔曲线。随着时间 t 的变化,A 点和 B 点的位置会改变,从而使得 P 点会沿着 P0、P1到 P2的一段曲线运动,而更为神气的是这是一条平滑的曲线。下面是数学公式推导和实际的动图演示。

image.png

二次贝塞尔曲线.gif

三次贝塞尔曲线

有了二次贝塞尔曲线的推导过程,实际上三次贝塞尔曲线的推导过程是一样的。

image.png

三次贝塞尔曲线有4个控制点,上图各个点的关系如下:

  • A 点是 P0到 P1的一次贝塞尔曲线,B 点是 P1到 P2的一次贝塞尔曲线,C 点是 P2到 P3的一次贝塞尔曲线;
  • D 点是 A 点到 B 点的一次贝塞尔曲线(也是 P0,P1和 P2的二次贝塞尔曲线),E 点是 B 点到 C 点的一次贝塞尔曲线(也是 P1,P2到 P3的二次贝塞尔曲线);
  • P 点是 D 点到 E 点的一次贝塞尔曲线,也是 A ,B 和 C 的二次贝塞尔曲线,进而就是 P0,P1,P2和 P3的三次贝塞尔曲线了。

下面是动图展示 P 点的移动过程。

三次贝塞尔曲线.gif

数学公式推导过程如下:
image.png

高阶贝塞尔函数

实际上,贝塞尔函数还可以继续增加控制点,推导的过程都是一样的,只是随着点数的增加,计算的量会越大,而我们大多数情况下用三阶贝塞尔曲线就足够了。

总结

本篇介绍了贝塞尔函数的概念,运动点的过程和公式推导,相信通过这些内容,大家应该能够知道贝塞尔曲线怎么回事了。下一篇我们来用 Flutter 绘制贝塞尔曲线,体验一下数学之美!


欢迎关注个人公众号:岛上码农

相关文章
|
6月前
|
JSON JavaScript 前端开发
实现ROS系统的Websocket传输,向Web应用推送sensor_msgs::Image数据
WebSocket协议具有低延迟和高实时性的特性,适用于实时数据推送。但是,它也依赖于网络条件,因此,在通过WebSocket发送数据时,保证网络稳定性也是重要的。以上步骤为建立基本的WebSocket传输提供了框架,并可以根据实际需求进行调整和优化。
553 0
|
存储 人工智能 算法
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
|
11月前
|
安全 图形学
Unity射线检测的“坑”
在 Unity 中,射线检测是常用功能,但也存在一些常见问题。首先是层(Layer)设置问题,如射线忽略某些层或误检测到不期望的层,需正确设置 LayerMask。其次是碰撞体相关问题,包括碰撞体未启用或类型不匹配,确保碰撞体启用并合理设置属性。再者是射线起始点和方向问题,错误的位置或方向计算会导致检测失败,需准确设置起始点和方向。此外,频繁进行射线检测或检测范围过大会影响性能,应减少检测次数并合理设置范围。最后,在多线程中进行射线检测可能导致错误,应避免在非主线程中直接调用射线检测。
ThreeJs绘制贝塞尔曲线
这篇文章介绍了如何利用Three.js绘制贝塞尔曲线,并提供了实现的代码示例与说明。
260 2
ThreeJs绘制贝塞尔曲线
|
算法 数据处理 图形学
开源项目推荐:Bezier曲线、B-Spline和NURBS的区别与《THE NURBS BOOK 2nd》简介
开源项目推荐:Bezier曲线、B-Spline和NURBS的区别与《THE NURBS BOOK 2nd》简介
3514 0
开源项目推荐:Bezier曲线、B-Spline和NURBS的区别与《THE NURBS BOOK 2nd》简介
ROS2教程 09 bag
本文是一篇关于ROS2中bag工具使用的教程,介绍了如何记录、回放和查看话题信息的命令和步骤。
1126 5
|
算法 C语言
一文搞懂:一文教你快速搞懂速度曲线规划之S形曲线(超详细+图文+推导+附件代码)
一文搞懂:一文教你快速搞懂速度曲线规划之S形曲线(超详细+图文+推导+附件代码)
862 0
一文搞懂:一文教你快速搞懂速度曲线规划之S形曲线(超详细+图文+推导+附件代码)
怎样在GitHub上建立仓库、以及怎样实现分支代码的合并。保姆级别的教程
这篇文章是一份详细的GitHub使用教程,介绍了如何在GitHub上创建仓库、创建分支、编辑和发布更改内容、发起拉取请求以及合并分支的操作步骤。
怎样在GitHub上建立仓库、以及怎样实现分支代码的合并。保姆级别的教程
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 网格布局Grid Layout
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 网格布局Grid Layout
3008 2
|
SQL 存储 安全
代码规范(如何提高代码规范)
在软件开发中,优雅的代码规范对于编写美观且实用的代码至关重要。以下是一些提升代码质量的建议: 1. **命名清晰**:使用描述性强的命名,使代码自解释,减少误解,提高可读性。 2. **简洁性**:用最少的代码实现功能,避免冗余,简洁的代码更易维护。 3. **一致性**:保持命名和编码风格的一致性,降低团队协作成本。 4. **注释**:合理注释解释代码意图,但避免过度注释。 5. **避免复杂性**:将复杂逻辑分解为简单部分,用函数或模块封装。 6. **重构**:定期重构代码以提高可读性和性能。 7. **测试**:编写单元测试确保代码的稳定性和可靠性。
299 1