Bezier曲线反求控制点
做曲线拟合的时候,往往希望拟合的曲线通过数据点,这个推导一下Bezier曲线控制点的计算过程.
曲线公式
曲线:C(u)=∑i=0nBn,i(u)Pi基函数:Bn,i=n!i!(n−i)!ui(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=03B3,i(u)Pi=(1−u)3P0+3(1−u)2uP1+3(1−u)u2P2+u3P3,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=[1000827492912712729498270001]C=[P0P1P2P3]
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−1C=B−1B∗PP=B−1C
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曲线;