贝塞尔曲线(Cubic Bezier Curve)
- 贝塞尔曲线使用4个控制点 P1,P2,P3,P4来控制曲线的形状
- 其中曲线通过P1(begin),P4(end) 点,接近但不通过P2,P3点
- 贝塞尔曲线的方程是一个三次多项式
以上就是贝塞尔曲线的一些基本特性,以下是贝塞尔曲线的公式。
P(t)=(1−t)3P1+3t(1−t)2P2+3t2(1−t)P3+t3P4
贝塞尔曲线在P1处的切线从P1指向P2也就是P2−P1下面简单证明:
P(t)′=−3(1−t)2P1+3(1−t)2P2−6t(1−t)P2+6t(1−t)P3−3t2P3+3t2P4
对P(t)求导得到上面的式子,令t=0,则得到−3P1+3P2,则切线方向是P2−P1,同理,令t=1,得到3P4−3P3,则切线方向是P4−P3。
我们可以把控制点之前带有t的式子看作是控制点的权重,则分别为
B1(t),B2(t),B3(t),B4(t)
我们可以把权重写成矩阵的形式
⎣⎢⎢⎡B1(t)B2(t)B3(t)B4(t)⎦⎥⎥⎤=⎣⎢⎢⎡1000−33003−630−13−31⎦⎥⎥⎤⎣⎢⎢⎡1tt2t3⎦⎥⎥⎤
进而把贝塞尔曲线的表达式写成矩阵的形式
P(t)=[x(t)y(y)]=[P1P2P3P4]⎣⎢⎢⎡1000−33003−630−13−31⎦⎥⎥⎤⎣⎢⎢⎡1tt2t3⎦⎥⎥⎤
等式左端第一个由控制点组成的矩阵我们称"Geometry matrix",第二个称"Spline matrix(Bernstein)“控制曲线的类型如Bernstein,第三个称"Canonical monomial basis”。由此我们可以给出一般曲线的公式
Q(t)=GBT(t)=GeometryG⋅SplienBasisB⋅PowerBasisT(t)
贝塞尔曲线只有四个控制点,如果我们想增加控制点怎么办呢?有一个Bi(t)的通用算法公式
Bin(t)=i!(n−i)!n!ti(1−t)n−i
n代表最高次数,i对应控制点顺序
每一个控制点都会影响曲线的形状,这不利于我们调整局部的效果而且控制点多了以后计算很困难,所以我们想能不能将一个贝塞尔曲线分成两个贝塞尔曲线?我们有如下算法:
- 取4个点组成线段的各自中点,依次连接
- 取新线段的中点,再连接
- 再取新线段的中点,得到P′′′
新的曲线分别为
P1,P1′,P1′′,P′′′P′′′,P2′′,P3′,P4
那么新得到的两个曲线是不是和原来四个控制点得到的曲线是相同的呢?
我们来证明分割后的第一段曲线,这里记为P1(t)简单证明:
P1′=2P1+P2P1′′=4P1+2P2+P3P′′′=8P1+3P2+3P3+P4
首先我们将贝塞尔曲线的原始式子拆开,按照t的降幂顺寻整理一下
P(t)=t3(−P1+3P2−3P3+P4)+t2(3P1−6P2+3P3)+t(−3P1+3P2)+P1
新的曲线的式子
P1(t)=(1−t)3P1+3t(1−t)2P1′+3t2(1−t)P1′′+t3P′′′
将新的坐标点带入
P1(t)=t3(−P1+3P1′−3P1′′+P′′′)+t2(3P1−6P1′+3P1′′)+t(−3P1+3P1′)+P1
将坐标代换
P1(t)=t3(−P1+32P1+P2−34P1+2P2+P3+8P1+3P2+3P3+P4)+
t2(3P1−62P1+P2+34P1+2P2+P3)+t(−3P1+32P1+P2)+P1
整理得
P1(t)=(21t)3(−P1+3P2−3P3+P4)+(21t)2(3P1−6P2+3P3)+(21t)(−3P1+3P2)+P1
这里t∈[0,1],令x=21t,则x∈[0,21]
P(x)=x3(−P1+3P2−3P3+P4)+x2(3P1−6P2+3P3)+x(−3P1+3P2)+P1
因为x∈[0,21],所以P(x)是P(t)的一半!
同理另外一段新曲线也可以证明。
至此我们证明了新分割出的曲线和原来的曲线是同一条曲线!我们的控制点由4个增加到了7个,可以更好的局部控制细节,不用影响整个曲线,而且增加了控制点,却没有增加多项式的次数,没有提升计算难度。事实上,我们不用取中点(0.5),任意比例的点都可以,例如我们取0.3的点(所有取点都要取0.3),也可以分割曲线