【数学与算法】贝塞尔(Bézier)曲线

这篇文章详细的介绍了贝塞尔(Bezier)曲线,点击跳转:【怎么理解贝塞尔曲线?】。

原文内容很多很详细,本文摘取了一部分,并对原文做了一定程度的更清晰的排版、说明和修改。

一阶贝塞尔曲线:

在这里插入图片描述

对于一阶贝塞尔曲线,从上图我们可以看到,它是一条直线,通过几何知识,很容易根据t\color{blue}tt 的值,得出线段上那个点的坐标:
B1(t)=P0+(P1−P0)t\color{blue}B_1(t)=P_0+(P_1-P_0)tB1(t)=P0+(P1P0)t
也可以变形为:
B1(t)=(1−t)P0+tP1,t∈[0,1]\color{blue}B_1(t)=(1-t)P_0+tP_1, t\in[0,1]B1(t)=(1t)P0+tP1,t[0,1]

一阶贝塞尔曲线很好理解, 就是根据 t\color{blue}tt 来的线性插值P0\color{blue}P_0P0表示的是一个向量[x,y]\color{blue} [x ,y][x,y], 其中x、y\color{blue}x、yxy是分别按照这个公式来计算的。

二阶贝塞尔曲线:

在这里插入图片描述
在这里插入图片描述
在平面内任选 3 个不共线的点,依次用线段连接。在第一条线段上任选一个点D\color{blue} DD。计算该点到线段起点的距离 AD\color{blue}ADAD,与该线段总长 AB\color{blue}ABAB 的比例。
在这里插入图片描述

根据上一步得到的比例,从第二条线段上找出对应的点 E,使得 AD:AB=BE:BC\color{blue}AD:AB = BE:BCAD:AB=BE:BC
在这里插入图片描述
在这里插入图片描述
这时候DE\color{blue}DEDE又是一条直线了, 就可以按照一阶的贝塞尔方程来进行线性插值了,
t=AD:AB\color{blue}t= AD:ABt=AD:AB
这时候就可以推出公式了.
在这里插入图片描述

P0′=(1−t)P0+tP1\color{blue}P_0'=(1-t)P_0+tP_1P0=(1t)P0+tP1 对应着上图绿色线段的左端点,P0′\color{blue}P_0'P0 点是 P0P1\color{blue}P_0P_1P0P1线段上的线性插值结果。

P1′=(1−t)P1+tP2\color{blue}P_1'=(1-t)P_1+tP_2P1=(1t)P1+tP2 对应着上图绿色线段的右端点,P1′\color{blue}P_1'P1 点是 P1P2\color{blue}P_1P_2P1P2线段上的线性插值结果。

B2(t)=(1−t)P0′+tP1′=(1−t)((1−t)P0+tP1)+t((1−t)P1+tP2)=(1−t)2P0+2t(1−t)P1+t2P2\color{blue} \begin{aligned} B_2(t)&=(1-t)P_0'+tP_1' \\ \\&=(1-t)((1-t)P_0+tP_1)+t((1-t)P_1+tP_2) \\\\ &=(1-t)^2P_0+2t(1-t)P_1+t^2P_2 \end{aligned} B2(t)=(1t)P0+tP1=(1t)((1t)P0+tP1)+t((1t)P1+tP2)=(1t)2P0+2t(1t)P1+t2P2
整理一下公式, 得到二阶贝塞尔公式:
B2(t)=(1−t)2P0+2t(1−t)P1+t2P2,t∈[0,1]\color{blue}B_2(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2, t\in[0,1]B2(t)=(1t)2P0+2t(1t)P1+t2P2,t[0,1]
二阶贝塞尔曲线对应着新构造的绿色线段的一阶贝塞尔曲线(线性插值)。P0、P1、P2\color{blue}P_0、P_1、P_2P0P1P2 这三个点是固定不变的点,但是这个绿色曲线是会随着 t\color{blue}tt 变化而变化的。

P0、P1、P2\color{blue}P_0、P_1、P_2P0P1P2这三个点,进行二阶贝塞尔曲线拟合,得到的曲线是图中的红色曲线:

  • t=0\color{blue}t=0t=0开始,B2(t)=P0\color{blue}B_2(t)=P_0B2(t)=P0,因此,起点和 P0\color{blue}P_0P0 点重合;
  • 0<t<1\color{blue}0<t<10<t<1时,曲线点就是图中红色线;
  • t=1\color{blue}t=1t=1终止,B2(t)=P2\color{blue}B_2(t)=P_2B2(t)=P2,因此,终点和 P2\color{blue}P_2P2 点重合;

下面是我的总结:

点击跳转【贝塞尔曲线动态图展示】直观理解贝塞尔曲线。
在这里插入图片描述
假如你有5个点P0、P1、P2、P3、P4\color{red}P_0、P_1、P_2、P_3、P_4P0P1P2P3P4,想根据这5个点拟合出一条曲线,那么,如果使用贝赛尔曲线的话,拟合的效果就如上图最后一个所示,最后一个图是4次贝塞尔曲线。4次贝塞尔曲线的控制点就是这五个点,其他点不是4次贝塞尔曲线控制点,叫做中间点,确切的说,是递归需要用到的其他低阶次的控制点。

在这里插入图片描述

通过上面图,可以看出,最终的(红色)曲线,就是对这几个点进行拟合得到的贝塞尔曲线。

n\color{blue}nn个控制点对应着n-1\color{blue}n-1n阶的贝塞尔曲线。

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

  • 4次贝塞尔曲线需要【递归】用到3次贝塞尔曲线;
  • 3次贝塞尔曲线需要【递归】用到2次贝塞尔曲线;
  • 2次贝塞尔曲线需要【递归】用到1次贝塞尔曲线;
  • 1次贝塞尔曲线就是线性插值,就是上面动图中的第一个图。

贝塞尔曲线的性质:

  1. 阶次是控制点个数减1。它限定了,给你n个点,你如果要使用贝塞尔曲线,那么只能使用n-1次贝塞尔曲线来拟合,这个限制条件不太友好;
  2. 牵一发动全身,移动一个控制点,整段曲线都会变化。

贝塞尔曲线的凸包性质

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

凸包可以理解为,有一堆点集,使用一个橡皮筋来套住所有点,最后橡皮筋围成的形状,就是这些点集的凸包。上面最后一个图的5个点中,其实最后一个点P4不是在凸多边形上,而是在这些点组成的凸包内部。

用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。

在这里插入图片描述
在这里插入图片描述

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注