贝塞尔曲线理论

贝塞尔曲线(Cubic Bezier Curve)

  1. 贝塞尔曲线使用4个控制点 P1,P2,P3,P4P_1,P_2,P_3,P_4来控制曲线的形状
  2. 其中曲线通过P1(begin),P4(end)P_1(begin),P_4(end) 点,接近但不通过P2,P3P_2,P_3
  3. 贝塞尔曲线的方程是一个三次多项式

以上就是贝塞尔曲线的一些基本特性,以下是贝塞尔曲线的公式。
P(t)=(1t)3P1+3t(1t)2P2+3t2(1t)P3+t3P4P(t) = (1-t)^3P_1+3t(1-t)^2P_2+3t^2(1-t)P_3+t^3P_4
贝塞尔曲线理论
贝塞尔曲线在P1P_1处的切线从P1P_1指向P2P_2也就是P2P1P_2-P_1下面简单证明:
P(t)=3(1t)2P1+3(1t)2P26t(1t)P2+6t(1t)P33t2P3+3t2P4 P(t)'=-3(1-t)^2P_1+3(1-t)^2P_2-6t(1-t)P_2+6t(1-t)P_3-3t^2P_3+3t^2P_4
P(t)P(t)求导得到上面的式子,令t=0t=0,则得到3P1+3P2-3P_1+3P_2,则切线方向是P2P1P_2-P_1,同理,令t=1t=1,得到3P43P33P_4-3P_3,则切线方向是P4P3P_4-P_3

我们可以把控制点之前带有tt的式子看作是控制点的权重,则分别为
B1(t),B2(t),B3(t),B4(t)B_1(t),B_2(t),B_3(t),B_4(t)
我们可以把权重写成矩阵的形式
[B1(t)B2(t)B3(t)B4(t)]=[1331036300330001][1tt2t3] \begin{bmatrix} B_1(t)\\ B_2(t)\\ B_3(t)\\ B_4(t) \end{bmatrix}= \begin{bmatrix} 1&-3&3&-1\\ 0&3&-6&3\\ 0&0&3&-3\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} 1\\ t\\ t^2\\ t^3 \end{bmatrix}
进而把贝塞尔曲线的表达式写成矩阵的形式
P(t)=[x(t)y(y)]=[P1P2P3P4][1331036300330001][1tt2t3] P(t)= \begin{bmatrix} x(t)\\ y(y) \end{bmatrix}= \begin{bmatrix} P_1&P_2&P_3&P_4 \end{bmatrix} \begin{bmatrix} 1&-3&3&-1\\ 0&3&-6&3\\ 0&0&3&-3\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} 1\\ t\\ t^2\\ t^3 \end{bmatrix}
等式左端第一个由控制点组成的矩阵我们称"Geometry matrix",第二个称"Spline matrix(Bernstein)“控制曲线的类型如Bernstein,第三个称"Canonical monomial basis”。由此我们可以给出一般曲线的公式
Q(t)=GBT(t)=GeometryGSplienBasisBPowerBasisT(t) Q(t) = GBT(t) = Geometry\quad \bm{G} \cdot Splien Basis \quad\bm{B} \cdot Power Basis \quad\bm{T(t)}
贝塞尔曲线只有四个控制点,如果我们想增加控制点怎么办呢?有一个Bi(t)B_i(t)的通用算法公式
Bin(t)=n!i!(ni)!ti(1t)ni B_i^n(t) = \frac{n!}{i!(n-i)!}t^i(1-t)^{n-i}
n代表最高次数,i对应控制点顺序
每一个控制点都会影响曲线的形状,这不利于我们调整局部的效果而且控制点多了以后计算很困难,所以我们想能不能将一个贝塞尔曲线分成两个贝塞尔曲线?我们有如下算法:

  1. 取4个点组成线段的各自中点,依次连接
  2. 取新线段的中点,再连接
  3. 再取新线段的中点,得到PP'''
    贝塞尔曲线理论
    新的曲线分别为
    P1,P1,P1,PP,P2,P3,P4P_1,P_1',P_1'',P'''\quad P''',P_2'',P_3',P_4
    那么新得到的两个曲线是不是和原来四个控制点得到的曲线是相同的呢?
    我们来证明分割后的第一段曲线,这里记为P1(t)P_1(t)简单证明:
    P1=P1+P22P1=P1+2P2+P34P=P1+3P2+3P3+P48 P_1'=\frac{P_1+P_2}{2}\quad P_1''=\frac{P_1+2P_2+P_3}{4}\quad P'''=\frac{P_1+3P_2+3P_3+P_4}{8}
    首先我们将贝塞尔曲线的原始式子拆开,按照tt的降幂顺寻整理一下
    P(t)=t3(P1+3P23P3+P4)+t2(3P16P2+3P3)+t(3P1+3P2)+P1 P(t) = t^3(-P_1+3P_2-3P_3+P_4)+t^2(3P_1-6P_2+3P_3)+t(-3P_1+3P_2)+P_1
    新的曲线的式子
    P1(t)=(1t)3P1+3t(1t)2P1+3t2(1t)P1+t3P P_1(t) = (1-t)^3P_1+3t(1-t)^2P_1'+3t^2(1-t)P_1''+t^3P'''
    将新的坐标点带入
    P1(t)=t3(P1+3P13P1+P)+t2(3P16P1+3P1)+t(3P1+3P1)+P1 P_1(t) = t^3(-P_1+3P_1'-3P_1''+P''')+ t^2(3P_1-6P_1'+3P_1'')+ t(-3P_1+3P_1')+ P_1
    将坐标代换
    P1(t)=t3(P1+3P1+P223P1+2P2+P34+P1+3P2+3P3+P48)+ P_1(t) = t^3(-P_1+3\frac{P_1+P_2}{2}-3\frac{P_1+2P_2+P_3}{4}+ \frac{P_1+3P_2+3P_3+P_4}{8})+
    t2(3P16P1+P22+3P1+2P2+P34)+t(3P1+3P1+P22)+P1 t^2(3P_1-6\frac{P_1+P_2}{2}+3\frac{P_1+2P_2+P_3}{4})+ t(-3P_1+3\frac{P_1+P_2}{2})+P_1
    整理得
    P1(t)=(12t)3(P1+3P23P3+P4)+(12t)2(3P16P2+3P3)+(12t)(3P1+3P2)+P1 P_1(t) = (\frac{1}{2}t)^3(-P_1+3P_2-3P_3+P_4)+ (\frac{1}{2}t)^2(3P_1-6P_2+3P_3)+ (\frac{1}{2}t)(-3P_1+3P_2)+P_1
    这里t[0,1]t\in[0,1],令x=12tx=\frac{1}{2}t,则x[0,12]x\in[0,\frac{1}{2}]
    P(x)=x3(P1+3P23P3+P4)+x2(3P16P2+3P3)+x(3P1+3P2)+P1P(x) = x^3(-P_1+3P_2-3P_3+P_4)+x^2(3P_1-6P_2+3P_3)+x(-3P_1+3P_2)+P_1
    因为x[0,12]x\in[0,\frac{1}{2}],所以P(x)P(x)P(t)P(t)的一半!
    同理另外一段新曲线也可以证明。
    至此我们证明了新分割出的曲线和原来的曲线是同一条曲线!我们的控制点由4个增加到了7个,可以更好的局部控制细节,不用影响整个曲线,而且增加了控制点,却没有增加多项式的次数,没有提升计算难度。事实上,我们不用取中点(0.5),任意比例的点都可以,例如我们取0.3的点(所有取点都要取0.3),也可以分割曲线