B站视频:wow,神奇的贝塞尔曲线!
博客:贝塞尔曲线简单介绍
知乎:曲线篇: 贝塞尔曲线



如上, P 0 P_0 P0、 P 1 P_1 P1 两点构成了一条线段,而我们可以通过一个函数——线性插值(lerp),来根据一个 t t t 值( t ∈ [ 0 , 1 ] t \in [0,1] t∈[0,1]) 得到线段上一点 P P P(图中一直在滑动的点)。而 P P P 的运动轨迹(红线),便是一阶贝塞尔线段(曲线)。线性插值的数学形式(一阶贝塞尔曲线公式)为:
P = l e r p ( P 0 , P 1 , t ) = ( 1 − t ) P 0 + t P 1 P=lerp(P_0,P_1,t)=(1-t)P_0 + tP_1 P=lerp(P0,P1,t)=(1−t)P0+tP1
一阶贝塞尔曲线有两个端点( P 0 P_0 P0、 P 1 P_1 P1 ),0个控制点。

如上,假设现在有点 P 2 P_2 P2 ,它与 P 1 P_1 P1 构成了新的线段,我们得到两个 一阶插值点( Q 1 Q_1 Q1、 Q 2 Q_2 Q2),它们构成了绿色线段,值得注意的是,两个插值点具有相同的 t t t 值。
而此时我们在绿色线段上生成一个 二阶插值点( P P P),并让它具有 与两个一阶插值点相同的 t t t 值。 那么该点的运动轨迹就是 二阶贝塞尔曲线。其公式推导为:
Q 1 = ( 1 − t ) P 0 + t P 1 Q_1 = (1-t)P_0 + tP_1 Q1=(1−t)P0+tP1
Q 2 = ( 1 − t ) P 1 + t P 2 Q_2 = (1-t)P_1 + tP_2 Q2=(1−t)P1+tP2
P
=
(
1
−
t
)
Q
1
+
t
Q
2
P = (1-t)Q_1 + tQ_2
P=(1−t)Q1+tQ2
=
(
1
−
t
)
(
(
1
−
t
)
P
0
+
t
P
1
)
+
t
(
(
1
−
t
)
P
1
+
t
P
2
)
=(1-t)((1-t)P_0 + tP_1) + t((1-t)P_1 + tP_2)
=(1−t)((1−t)P0+tP1)+t((1−t)P1+tP2)
=
(
1
−
t
)
2
P
0
+
2
t
(
t
−
1
)
P
1
+
t
2
P
2
=(1-t)^2P_0+2t(t-1)P_1+t^2P_2
=(1−t)2P0+2t(t−1)P1+t2P2
二阶贝塞尔曲线有两个端点( P 0 P_0 P0、 P 2 P_2 P2),一个控制点( P 1 P_1 P1)。

经过对一阶、二阶贝塞尔曲线的研究学习,我们能知道贝塞尔曲线通过在两点之间再采点的方式实现降阶,每一次选点都是一次的降阶。
公式推导过程同二阶贝塞尔曲线,因此不做赘述,直接贴出公式:
P = ( 1 − t ) 3 P 0 + 3 t ( 1 − t ) 2 P 1 + 3 t 2 ( 1 − t ) P 2 + t 3 P 3 P=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3 P=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3
三阶贝塞尔曲线有两个端点( P 0 P_0 P0、 P 3 P_3 P3),两个控制点( P 1 P_1 P1、 P 2 P_2 P2)。


P ( t ) = ∑ i = 0 n P i B i , n ( t ) , t ∈ [ 0 , 1 ] P(t)=\sum_{i=0}^{n}P_iB_{i,n}(t),t \in [0,1] P(t)=i=0∑nPiBi,n(t),t∈[0,1]
B i , n ( t ) = C n i t i ( 1 − t ) n − i = n ! i ! ( n − i ) ! t i ( 1 − t ) n − i ,【 i = 0 , 1 , . . . , n 】 B_{i,n}(t)=C_n^it^i(1-t)^{n-i}=\frac{n!}{i!(n-i)!}t^i(1-t)^{n-i},【i=0,1,...,n】 Bi,n(t)=Cniti(1−t)n−i=i!(n−i)!n!ti(1−t)n−i,【i=0,1,...,n】