Bezier曲线反求控制点
做曲线拟合的时候,往往希望拟合的曲线通过数据点,这个推导一下Bezier曲线控制点的计算过程.
曲线公式
曲 线 : C ( u ) = ∑ i = 0 n B n , i ( u ) P i 基 函 数 : B n , i = n ! i ! ( n − i ) ! u i ( 1 − u ) n − i 曲线:C(u) = \sum^n_{i=0}B_{n,i}(u)P_i\\ 基函数:B_{n,i}=\frac{n!}{i!(n-i)!}u^i(1-u)^{n-i} 曲线:C(u)=i=0∑nBn,i(u)Pi基函数:Bn,i=i!(n−i)!n!ui(1−u)n−i
这里求解控制点,即C为已知信息,求解式中的P.
计算3次Bezier曲线控制点
曲线多项式:
C ( u ) = ∑ i = 0 3 B 3 , i ( u ) P i = ( 1 − u ) 3 P 0 + 3 ( 1 − u ) 2 u P 1 + 3 ( 1 − u ) u 2 P 2 + u 3 P 3 , 0 ≤ u ≤ 1 C(u) = \sum^3_{i=0}B_{3,i}(u)P_i=(1-u)^3P_0+3(1-u)^2uP_1+3(1-u)u^2P_2+u^3P_3,\quad 0\le u \le 1 C(u)=i=0∑3B3,i(u)Pi=(1−u)3P0+3(1−u)2uP1+3(1−u)u2P2+u3P3,0≤u≤1
写成矩阵方式:
C
=
B
∗
P
C=B*P
C=B∗P
式中:
B
=
[
1
0
0
0
8
27
4
9
2
9
1
27
1
27
2
9
4
9
8
27
0
0
0
1
]
C
=
[
P
0
P
1
P
2
P
3
]
B = \left[ \begin{matrix} 1 & 0 & 0 & 0\\ \frac{8}{27} & \frac{4}{9} & \frac{2}{9} & \frac{1}{27}\\ \frac{1}{27} & \frac{2}{9} & \frac{4}{9} & \frac{8}{27}\\ 0 & 0 & 0 & 1\\ \end{matrix} \right]\\ C = \left[ \begin{matrix} P_0\\ P_1\\ P_2\\ P_3\\ \end{matrix} \right]
B=⎣⎢⎢⎡1278271009492009294002712781⎦⎥⎥⎤C=⎣⎢⎢⎡P0P1P2P3⎦⎥⎥⎤
则 得到;
B
−
1
C
=
B
−
1
B
∗
P
P
=
B
−
1
C
B^{-1}C=B^{-1}B*P\\ P = B^{-1}C
B−1C=B−1B∗PP=B−1C
即可计算得到相应的样条曲线控制点.
Python验证
取点位 C0(0,0) C1(0,2) C2(2,2) C3(2,0)
计算控制点P后,画出如下Bezier曲线:
黑色点为原始数据点;
红色点为计算得到的控制点;
蓝色曲线为由原始数据点直接拟合的Bezier曲线;
橘黄色为由控制点拟合的Bezier曲线;