计算单位三次贝塞尔曲线的多项式系数

时间:2014-11-18 18:27:09

标签: ios uibezierpath bezier camediatiming

我正在分析Apple的这段代码:

http://opensource.apple.com/source/WebCore/WebCore-955.66/platform/graphics/UnitBezier.h

我特别不理解的部分是这个部分,他们计算曲线的多项式系数(他们假设P0和P1分别是(0,0)和(1,1)):

UnitBezier(double p1x, double p1y, double p2x, double p2y)
        {
            // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
            cx = 3.0 * p1x;
            bx = 3.0 * (p2x - p1x) - cx;
            ax = 1.0 - cx -bx;

            cy = 3.0 * p1y;
            by = 3.0 * (p2y - p1y) - cy;
            ay = 1.0 - cy - by;
        }

我假设他们正在使用立方贝塞尔函数:

enter image description here

有人可以通过他们正在使用的步骤来简化这个等式来获得这些系数吗?我假设因为P0是(0,0),第一部分可以被移除,并且由于P3是(1,1),最后一部分变成t ^ 3,所以离开:

3 *(1-t)^ 2 * t * P1 + 3 *(1-t)* t ^ 2 * P2 + t ^ 3

他们如何简化计算多项式系数ax,bx和cx?还是我离开基地?

1 个答案:

答案 0 :(得分:0)

在经历了很多困难之后,我想出了发生了什么。

将上述多项式乘以将简化为:

3(p1x)t -6(p1x)t^2 +3(p1x)t^3 +3(p2x)t^2 -3(p2x)t^3 +t^3

我们可以根据't'的权力对此进行分组:

(3(p1x) - 3(p2x) + 1) * t^3
+
(3(p2x) - 6(p1x)) * t^2
+
(3(p1x)) * t

基本上,

cx = 3*p1x (this one is easy)

bx = (3(p2x) - 6(p1x))
   = (3(p2x) - 3(p1x) - 3(p1x)
   = 3(p2x - p1x) - cx

ax = 3(p1x) - 3(p2x) + 1
   = 1 - 3(p1x) - 3(p2x) + 6(p1x)
   = 1 - 3(p1x) - 3(p2x) + 3(p1x) + 3(p1x)
   = 1 - 3(p1x) - (3(p2x) - 3(p1x) - 3(p1x))
   = 1 - 3(p1x) - (3(p2x - p1x) - 3(p1x))
   = 1 - cx - (3(p2x - p1x) - cx)
   = 1 - cx - bx