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=0nBn,i(u)PiBn,i=i!(ni)!n!ui(1u)ni

这里求解控制点,即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=03B3,i(u)Pi=(1u)3P0+3(1u)2uP1+3(1u)u2P2+u3P3,0u1

写成矩阵方式:

C=B∗P C=B*P C=BP
式中:

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=1278271009492009294002712781C=P0P1P2P3
 
则 得到;
B−1C=B−1B∗PP=B−1C B^{-1}C=B^{-1}B*P\\ P = B^{-1}C B1C=B1BPP=B1C
即可计算得到相应的样条曲线控制点.

Python验证

取点位 C0(0,0) C1(0,2) C2(2,2) C3(2,0)

计算控制点P后,画出如下Bezier曲线:
在这里插入图片描述

黑色点为原始数据点;
红色点为计算得到的控制点;
蓝色曲线为由原始数据点直接拟合的Bezier曲线;
橘黄色为由控制点拟合的Bezier曲线;
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐