二次贝塞尔曲线转换为三次贝塞尔曲线
在使用cairo绘图的时候,发现cairo不支持二次贝塞尔曲线的绘制,为了与QT实现的canvas的行为一致,cairo必须同样实现二次贝塞尔曲线的绘制。思路是将二次转换成三次,然后用3次的方式绘制。
二次贝塞尔曲线公式
Q(t) = Q0 (1-t)² + 2 Q1 (1-t) t + Q2 t²
三次贝塞尔曲线公式
Q(t) = Q0 (1-t)² + 2 Q1 (1-t) t + Q2 t²
公式推导过程
将二次贝塞尔曲线转换成三次贝塞尔曲线,必须要让这两个多项式相等,它们的多项式系数必须相等。
通过展开表达式:(1-t)²= 1- 2t + t²),然后把所有的项分解成1、t、t²和t³,得到多项式系数:
Q(t) = Q0 + (-2Q0 + 2Q1) t + (Q0 – 2Q1 + Q2) t²
C(t) = C0 + (-3C0 + 3C1) t + (3C0 – 6C1 + 3C2) t² + (-C0 + 3C1 -3C2 + C3) t³
因此,可以得到以下4个方程:
C0 = Q0
-3C0 + 3C1 = -2Q0 + 2Q1
3C0 – 6C1 + 3C2 = Q0 – 2Q1 + Q2
-C0 + 3C1 -3C2 + C3 = 0
将第二行中的C0代入Q0就可以解出C1,得到:
C1 = Q0 + (2/3) (Q1 – Q0)
然后,可以继续代入求出C2然后求出C3,或者简单地说,通过对称性,得出结论:
C0 = Q0
C1 = Q0 + (2/3) (Q1 – Q0)
C2 = Q2 + (2/3) (Q1 – Q2)
C3 = Q2