What is Bezier Curve#


贝塞尔曲线是控制点按一定规则和比例插值得到的曲线。
他的几何意义下计算规则如下:
Givenp1p2distanceratio=point1=point2=(p2−p1)=100percentage,new point=p1+distance⋅ratio
Mathematics of Bezier Curve#
贝塞尔曲线是一种”参数化”函数(“parametric” function)。贝塞尔曲线是关于参数 t 的多项式, 其中 t∈[0,1]。
我们定义一个杨辉三角(Pascal’s triangle) 的打表:
linearsqurecubicquartic=1+1=1+2+1=1+3+3+1=1+4+6+4+1我们容易得到贝塞尔曲线在一阶, 二阶, 三阶的情况:
linearsqurecubic=(1−t)+t=(1−t)2+2t(1−t)+t2=(1−t)3+3t(1−t)2+3t2(1−t)+t3进一步, 可以得到 Bezier 的通用公式:
Bezier(n,t)=∑nPascal(n,i)⋅(1−t)n−i⋅ti
Control Bezier Curvatures#
在上面的公式上, 再添加 Weight 就是带有控制点的贝塞尔曲线公式:
Bezier(n,t)=∑nPascal(n,i)⋅(1−t)n−i⋅ti⋅WiWeight 是控制点的坐标值, W0 是起始坐标, Wn 是终点坐标, 中间的 Wi 就是贝塞尔曲线的控制点。
Bezier Curvatures as Matrix Operations#
贝塞尔曲线能表示为矩阵形式, 特别地, 针对三次贝塞尔曲线, 可以表示为:
B(t)=[1tt2t3]⋅1−33−103−63003−30001⋅p1p2p3p4
de Casteljau’s Algorithm#
德卡斯特里奥算法 是计算伯恩斯坦形式的多项式或贝塞尔曲线的递归方法。
算法计算步骤如下:
-
取曲线定义点间的所有线段, 对于 n 阶的曲线, 就是 n 条线段。
-
沿每条线段 t 位置放置标记。
-
连接这些标记点, 形成 t−1 条线段。
-
在上述线段的 t 位置再次放置标记。
-
连接这些标记点, 形成 t−2 条线段。
-
递归上述流程。
-
最终只剩下一条线段, 得到比率 t 下的曲线位置。

Split Curve#

德卡斯特里奥算法可以实现贝塞尔曲线的分割。
Splite Curve using Matrices#
对于任意三次贝塞尔曲线
B(t)=[1tt2t3]⋅1−33−103−63003−30001⋅p1p2p3p4可以在 t=z 处分割为两条贝塞尔曲线。
那么引入 z 的左曲线矩阵为:
B(t)=[1(z⋅t)(z⋅t)2(z⋅t)3]⋅1−33−103−63003−30001⋅P1P2P3P4=[1tt2t3]⋅10000z0000z20000z3⋅1−33−103−63003−30001⋅P1P2P3P4如果这个矩阵表达式侧能被表达为 [t Values]⋅[Bezier matrix]⋅[column matrix] 的形式, 那么就可以得到 t=0 到 t=z 的贝塞尔曲线矩阵。
简单起见, 推算过程以二次贝塞尔曲线矩阵为例:
首先, 我们定义三次贝塞尔矩阵为 M:
M=1−33−103−63003−30001定义 Z 矩阵
10000z0000z20000z3那么
B(t)=[1tt2t3]⋅10000z0000z20000z3⋅1−33−103−63003−30001⋅P1P2P3P4=[1tt2t3]⋅Z⋅M⋅1−33−103−63003−30001=[1tt2t3]⋅M⋅M−1⋅Z⋅MP1P2P3P4也就是说, 最后得到的点的仅需要乘以矩阵
Q=M−1⋅Z⋅M就得到了分割后矩阵的新的控制点。
另外, 这个算法是解析出来的, 针对我们常规的贝塞尔曲线解是唯一的(有理贝塞尔曲线会添加控制点影响度的参数, 解控制点的位置就不唯一)。
最后得到左曲线:
=1−(z−1)(z−1)2−(z−1)30z−2⋅(z−1)⋅z3⋅(z−1)2⋅z00z2−3⋅(z−1)⋅z2000z3P1P2P3P4P1z⋅P2−(z−1)⋅P1z2⋅P3−2⋅z⋅(z−1)⋅P2+(z−1)2⋅P1z3⋅P4−3⋅z2⋅(z−1)⋅P3+3⋅z⋅(z−1)2⋅P2−(z−1)3⋅P1得到右曲线:
=−(z−1)30003⋅(z−1)2⋅z(z−1)200−3⋅(z−1)⋅z2−2⋅(z−1)⋅z−(z−1)0z3z2z1⋅P1P2P3P4z3⋅P4−3⋅z2⋅(z−1)⋅P3+3⋅z⋅(z−1)2⋅P2−(z−1)3⋅P1z2⋅P4−2⋅z⋅(z−1)⋅P3+(z−1)2⋅P2z⋅P4−(z−1)⋅P3P4
Possibility of Curve Segmentation#
我们已经得到了贝塞尔曲线的分割的解析解, 现在需要考察的是, 在 1/3 和 2/3 处是否一定能找到对应的解析解。
也就是说, 矩阵方程
=x1z⋅x2−(z−1)⋅x1z2⋅x3−2⋅z⋅(z−1)⋅x2+(z−1)2⋅x1x4′=z3⋅x4−3⋅z2⋅(z−1)⋅x3+3⋅z⋅(z−1)2⋅x2−(z−1)3⋅x1x132x1+31x4′31x1+32x4′x4′尝试展开式子, 显然, 这个式子很容易看出是无解的。
所以得出结论, 用曲线分割的方式去得到 1/3 和 2/3 的固定三次贝塞尔贝塞尔表达任意三次贝塞尔曲线是没有解析解的。