【数学与算法】贝塞尔(Bézier)曲线
这篇文章详细的介绍了贝塞尔(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+(P1−P0)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)=(1−t)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
x、y是分别按照这个公式来计算的。
二阶贝塞尔曲线:
在平面内任选 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′=(1−t)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′=(1−t)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)=(1−t)P0′+tP1′=(1−t)((1−t)P0+tP1)+t((1−t)P1+tP2)=(1−t)2P0+2t(1−t)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)=(1−t)2P0+2t(1−t)P1+t2P2,t∈[0,1]
二阶贝塞尔曲线
对应着新构造的绿色线段的一阶贝塞尔曲线
(线性插值
)。
P
0
、
P
1
、
P
2
\color{blue}P_0、P_1、P_2
P0、P1、P2 这三个点是固定不变的点,但是这个绿色曲线是会随着
t
\color{blue}t
t 变化而变化的。
由
P
0
、
P
1
、
P
2
\color{blue}P_0、P_1、P_2
P0、P1、P2这三个点,进行二阶贝塞尔曲线
拟合,得到的曲线是图中的红色曲线:
- 从 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
P0、P1、P2、P3、P4,想根据这5个点拟合出一条曲线,那么,如果使用贝赛尔曲线的话,拟合的效果就如上图最后一个所示,最后一个图是4次贝塞尔曲线。4次贝塞尔曲线的控制点就是这五个点,其他点不是4次贝塞尔曲线控制点,叫做中间点,确切的说,是递归需要用到的其他低阶次的控制点。
通过上面图,可以看出,最终的(红色)曲线,就是对这几个点进行拟合得到的贝塞尔曲线。
n \color{blue}n n个控制点对应着 n - 1 \color{blue}n-1 n-1阶的贝塞尔曲线。
高阶的贝塞尔可以通过不停的递归直到一阶:
- 4次贝塞尔曲线需要【递归】用到3次贝塞尔曲线;
- 3次贝塞尔曲线需要【递归】用到2次贝塞尔曲线;
- 2次贝塞尔曲线需要【递归】用到1次贝塞尔曲线;
- 1次贝塞尔曲线就是
线性插值
,就是上面动图中的第一个图。
贝塞尔曲线的性质:
- 阶次是控制点个数减1。它限定了,给你n个点,你如果要使用贝塞尔曲线,那么只能使用n-1次贝塞尔曲线来拟合,这个限制条件不太友好;
- 牵一发动全身,移动一个控制点,整段曲线都会变化。
贝塞尔曲线的凸包性质
贝塞尔曲线始终会在包含了所有控制点的最小凸多边形中
, 不是
按照控制点的顺序围成的最小多边形。这点大家一定注意. 这一点的是很关键的,也就是说可以通过控制点的凸包来限制规划曲线的范围,在路径规划是很需要的一个性质.
凸包可以理解为,有一堆点集,使用一个橡皮筋来套住所有点,最后橡皮筋围成的形状,就是这些点集的凸包。上面最后一个图的5个点中,其实最后一个点P4不是在凸多边形上,而是在这些点组成的凸包内部。
用不严谨的话来讲,给定二维平面上的点集,凸包
就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。
更多推荐
所有评论(0)