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

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

一阶贝塞尔曲线:

在这里插入图片描述

对于一阶贝塞尔曲线,从上图我们可以看到,它是一条直线,通过几何知识,很容易根据 t \color{blue}t t 的值,得出线段上那个点的坐标:
B 1 ( t ) = P 0 + ( P 1 − P 0 ) t \color{blue}B_1(t)=P_0+(P_1-P_0)t B1(t)=P0+(P1P0)t
也可以变形为:
B 1 ( t ) = ( 1 − t ) P 0 + t P 1 , 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}t t 来的线性插值 P 0 \color{blue}P_0 P0表示的是一个向量 [ x , y ] \color{blue} [x ,y] [x,y], 其中 x 、 y \color{blue}x、y xy是分别按照这个公式来计算的。

二阶贝塞尔曲线:

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

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

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

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

B 2 ( t ) = ( 1 − t ) P 0 ′ + t P 1 ′ = ( 1 − t ) ( ( 1 − t ) P 0 + t P 1 ) + t ( ( 1 − t ) P 1 + t P 2 ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 \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
整理一下公式, 得到二阶贝塞尔公式:
B 2 ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 , 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]
二阶贝塞尔曲线对应着新构造的绿色线段的一阶贝塞尔曲线(线性插值)。 P 0 、 P 1 、 P 2 \color{blue}P_0、P_1、P_2 P0P1P2 这三个点是固定不变的点,但是这个绿色曲线是会随着 t \color{blue}t t 变化而变化的。

P 0 、 P 1 、 P 2 \color{blue}P_0、P_1、P_2 P0P1P2这三个点,进行二阶贝塞尔曲线拟合,得到的曲线是图中的红色曲线:

  • t = 0 \color{blue}t=0 t=0开始, B 2 ( t ) = P 0 \color{blue}B_2(t)=P_0 B2(t)=P0,因此,起点和 P 0 \color{blue}P_0 P0 点重合;
  • 0 < t < 1 \color{blue}0<t<1 0<t<1时,曲线点就是图中红色线;
  • t = 1 \color{blue}t=1 t=1终止, B 2 ( t ) = P 2 \color{blue}B_2(t)=P_2 B2(t)=P2,因此,终点和 P 2 \color{blue}P_2 P2 点重合;

下面是我的总结:

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

在这里插入图片描述

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

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

高阶的贝塞尔可以通过不停的递归直到一阶:
  • 4次贝塞尔曲线需要【递归】用到3次贝塞尔曲线;
  • 3次贝塞尔曲线需要【递归】用到2次贝塞尔曲线;
  • 2次贝塞尔曲线需要【递归】用到1次贝塞尔曲线;
  • 1次贝塞尔曲线就是线性插值,就是上面动图中的第一个图。

贝塞尔曲线的性质:

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

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

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

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

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐