最近正在研究贝塞尔曲线. 在学习之际也把自己的思路写下来.

下面的链接可以拖拽贝塞尔的点, 先感受一下贝塞尔曲线的圆润.

贝塞尔曲线的历史:

贝塞尔曲线于 1962 年,由法国工程师皮埃尔·贝济埃(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计,贝塞尔曲线最初由保尔·德·卡斯特里奥于1959年运用德卡斯特里奥算法开发,以稳定数值的方法求出贝塞尔曲线.

贝塞尔曲线有着很多特殊的性质, 在图形设计和路径规划中应用都非常广泛, 我就是想在路径规划中

贝塞尔曲线完全由其控制点决定其形状, n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制. 画重点了啊: 递归

一阶曲线:

对于一阶贝塞尔曲线为我们可以看到是一条直线,通过几何知识,很容易根据t的值得出线段上那个点的坐标:

一阶曲线就是很好理解, 就是根据t来的线性插值. P0表示的是一个向量 [x ,y], 其中x和y是分别按照这个公式来计算的.

二阶贝塞尔:

既然重点是递归, 那么二阶贝塞尔必然和一阶有关系.

在平面内任选 3 个不共线的点,依次用线段连接。在第一条线段上任选一个点 D。计算该点到线段起点的距离 AD,与该线段总长 AB 的比例。
根据上一步得到的比例,从第二条线段上找出对应的点 E,使得 AD:AB = BE:BC。

这时候DE又是一条直线了, 就可以按照一阶的贝塞尔方程来进行线性插值了, t= AD:AE

这时候就可以推出公式了.

推公式的主图
对应着上图绿色线段的左端点
对应着上图绿色线段的右端点
对应着绿色线段的一阶贝塞尔曲线(线性插值)
整理一下公式, 得到二阶贝塞尔公式

三阶贝塞尔曲线:

二阶的贝塞尔通过在控制点之间再采点的方式实现降阶, 每一次选点都是一次的降阶.

四个点对应是三次的贝塞尔曲线. 分别在 AB BC CD 之间采EFG点, EFG三个点对应着二阶贝塞尔, 在EF FG之间采集HI点来降阶为一阶贝塞尔曲线.

高阶贝塞尔曲线:

高阶的贝塞尔可以通过不停的递归直到一阶

贝塞尔曲线 公式

可以通过递归的方式来理解贝塞尔曲线, 但是还是给出公式才方便计算的.

仔细看可以发现, 贝塞尔的参数B是二项式(t+(1-t))^n = (1)^n的展开公式. 划重点了: 系数是二项式的展开. 后面的很多的贝塞尔曲线的性质都可以用这个来解释

贝塞尔曲线的导数

变化一下贝塞尔公式:

和上文中的公式相同, 但是有一些字母的替换, 表达习惯不同

控制点是独立的, 因此求导是直接对u就行求导, 就是仅仅对参数项B进行求导.

定义: Q0=n*(P1-P0), Q0=n*(P2-P1), Q0=n*(P3-P2),...Qn-1=n*(Pn-Pn-1), . 如果我们把Q当做一组新的控制点, 那么原贝塞尔的导数可以写成如下:

导数还是贝塞尔曲线, 只不过是控制点是原来控制点的组合而已.

This derivative curve is usually referred to as the hodograph of the original Bézier curve. 贝塞尔的导数可以理解为原贝塞尔的速度曲线.(瞎翻译的)

七阶贝塞尔曲线和其导数曲线(六阶贝塞尔曲线)

以此类推:

可以得出一个很有趣的结论, 贝塞尔曲线的导数还是贝塞尔曲线.

贝塞尔曲线的性质

1 各项系数之和为1.

这个很好理解,因为是系数是二项式的展开(t+(1-t))^n = (1)^n非负性. 好理解, 二项式的展开啊

2 对称性

第i项系数和倒数第i项系数相同, 从二项式的展开来思考,这个也好理解

3 递归性

递归性指其系数满足下式:

这个好理解, 因为我们就是从递归来理解贝塞尔曲线的

4 凸包性质

贝塞尔曲线始终会在包含了所有控制点的最小凸多边形中, 不是按照控制点的顺序围成的最小多边形. 这点大家一定注意. 这一点的是很关键的,也就是说可以通过控制点的凸包来限制规划曲线的范围,在路径规划是很需要的一个性质.

5端点性质

第一个控制点和最后一个控制点,恰好是曲线的起始点和终点.这一点可以套用二项式展开来理解,t=1或者0的时候,相乘二项式的系数,出了初始点或者末尾点,其余的都是0.

6一阶导数性质

假设上图中贝塞尔的t是由左到右从0到1增加的,那么贝塞尔曲线在t=0时的导数是和P0P1的斜率(导数)是相同,t=1时的导数是和P3P4的斜率(导数)是相同

这一点的性质可以用在贝塞尔曲线的拼接,只要保证三点一线中的中间点是两段贝塞尔曲线的连接点,就可以保证两端贝塞尔曲线的导数连续连续.导数连续是曲线的G1连续. 如果保证C1连续呢?

如果不懂G1和C1连续的意义, 先看我之前写的这篇文章.

如果保证两段贝塞尔拼接曲线的曲率连续呢?控制点要怎么排布呢?

这就非常的复杂了, 建议直接参考下文:


专栏里每一篇都是我一个字一个字打的,都是我认为的原创干货。
欢迎指正讨论,转载请注明,认同请点赞。
这个系列的文章很容易出错,希望大佬们多多指正补充。
仅仅收藏是学不会的,还得点赞。

参考资料

biaodianfu.com/bezier-c
whudj.cn/?
qiujiawei.com/bezier-1/
zhuanlan.zhihu.com/p/13
github.com/antvis/g6/is

HKUST-Aerial-Robotics/Fast-Planner

pomax.github.io/bezieri

最好的参考资料如下: