参考:
贝塞尔曲线扫盲
贝塞尔曲线的理解
使用贝塞尔曲线绘制多点连接曲线
Bezier curves and surfaces
Bezier Curve Drawing Algorithms
Construction of Bézier Curves
首先来直观地看一下Bezier曲线是什么样的。
这是个二次Bezier曲线,经过
P
0
P_0
P0 和
P
2
P_2
P2 这个两个点,并且受到
P
1
P_1
P1 点的牵引:
曲线的表达式也极为美观:
C
(
t
)
=
(
1
−
t
)
2
P
0
+
t
(
1
−
t
)
P
1
+
t
2
P
2
,
t
∈
[
0
,
1
]
C(t) = (1-t)^2 P_0 + t(1-t)P_1+t^2P_2,t \in [0,1]
C(t)=(1−t)2P0+t(1−t)P1+t2P2,t∈[0,1]
(C means curve)
其实这么一看应该也就能理解Bezier曲线的思想了,也就是给与数据点不同的“权重”来计算出的一种曲线,这些点和权重决定了曲线的某种走势。
给出个稍微严格点的定义吧:
给定空间中的n+1个点
P
0
P_0
P0 ,
P
1
P_1
P1,
P
2
P_2
P2,…和
P
n
P_n
Pn,由这些点定义的Bezier曲线是
C
(
u
)
=
∑
i
=
0
n
B
n
,
i
(
u
)
P
i
C(u) = \sum_{i=0}^n B_{n,i} (u) P_i
C(u)=i=0∑nBn,i(u)Pi
其中,
B
n
,
i
(
u
)
=
n
!
i
!
(
n
−
i
)
!
u
i
(
1
−
u
)
n
−
i
B_n,_i (u) = \frac{n!}{i!(n-i)!}u^i(1-u)^{n-i}
Bn,i(u)=i!(n−i)!n!ui(1−u)n−i,也被称为Bernstein多项式。
由Bernstein多项式来计算Bezier曲线是显而易见的的方法,然而这种方法并不是数值稳定的(会引入数值计算误差),因此在实际中,通常采用的是de Casteljau算法。