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

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

贝塞尔曲线介绍

我们在前面讲了绘制自定义曲线,而实际开发过程还会遇到更复杂的图形绘制,比如下面的这些图形:
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 绘制贝塞尔曲线,体验一下数学之美!


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

相关文章
|
11月前
|
Serverless Go
手把手教你用Go语言画出正弦图像 模拟画图不再难!
手把手教你用Go语言画出正弦图像 模拟画图不再难!
152 0
一文搞懂:关于laplacian坐标的编译
一文搞懂:关于laplacian坐标的编译
|
2月前
|
C语言
C语言实战 | 弹跳的小球
【7月更文挑战第6天】使用C语言实现了一个小球(小方块)在屏幕上斜向移动并反弹的程序。当小球碰到边界时,其运动方向会发生改变。代码分为三部分,分别处理初始化、主循环和更新位置及边界检测。变量drow和dcol控制移动方向,遇到边界时会反转它们的值。
30 3
C语言实战 | 弹跳的小球
|
3月前
一文搞懂:三角形的余弦定理
一文搞懂:三角形的余弦定理
30 0
|
4月前
|
机器学习/深度学习 算法
面试题 01.07:旋转矩阵
面试题 01.07:旋转矩阵
26 0
|
4月前
|
存储
面试题 05.08:绘制直线
面试题 05.08:绘制直线
37 0
|
11月前
|
存储 算法 Java
基于Y向连贯性算法的多边形扫描线生成(适用于凸多边形和凹多边形)【原理+java实现】
基于Y向连贯性算法的多边形扫描线生成(适用于凸多边形和凹多边形)【原理+java实现】
180 0
Leecode 836. 矩形重叠最简单易懂的一个思想
Leecode 836. 矩形重叠最简单易懂的一个思想
41 0
|
测试技术
每日一题——旋转函数
每日一题——旋转函数
92 0
每日一题——旋转函数
|
机器学习/深度学习 存储 算法
(建议收藏)一文多图,彻底搞懂Floyd算法(多源最短路径)
在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。
5295 1
(建议收藏)一文多图,彻底搞懂Floyd算法(多源最短路径)