本文主要是介绍Bezier曲线反求控制点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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曲线;
这篇关于Bezier曲线反求控制点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!