贝塞尔曲线理论

贝塞尔曲线(Cubic Bezier Curve)

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

以上就是贝塞尔曲线的一些基本特性,以下是贝塞尔曲线的公式。
P ( t ) = ( 1 − t ) 3 P 1 + 3 t ( 1 − t ) 2 P 2 + 3 t 2 ( 1 − t ) P 3 + t 3 P 4 P(t) = (1-t)^3P_1+3t(1-t)^2P_2+3t^2(1-t)P_3+t^3P_4 P(t)=(1t)3P1+3t(1t)2P2+3t2(1t)P3+t3P4
贝塞尔曲线理论_第1张图片
贝塞尔曲线在 P 1 P_1 P1处的切线从 P 1 P_1 P1指向 P 2 P_2 P2也就是 P 2 − P 1 P_2-P_1 P2P1下面简单证明:
P ( t ) ′ = − 3 ( 1 − t ) 2 P 1 + 3 ( 1 − t ) 2 P 2 − 6 t ( 1 − t ) P 2 + 6 t ( 1 − t ) P 3 − 3 t 2 P 3 + 3 t 2 P 4 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)=3(1t)2P1+3(1t)2P26t(1t)P2+6t(1t)P33t2P3+3t2P4
P ( t ) P(t) P(t)求导得到上面的式子,令 t = 0 t=0 t=0,则得到 − 3 P 1 + 3 P 2 -3P_1+3P_2 3P1+3P2,则切线方向是 P 2 − P 1 P_2-P_1 P2P1,同理,令 t = 1 t=1 t=1,得到 3 P 4 − 3 P 3 3P_4-3P_3 3P43P3,则切线方向是 P 4 − P 3 P_4-P_3 P4P3

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

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

你可能感兴趣的:(计算机图形学,bezier)