0

我正在分析 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;
        }

我假设他们正在使用三次贝塞尔函数:

在此处输入图像描述

有人可以通过他们用来简化这个方程来获得这些系数的步骤吗?我假设由于 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?还是我离这里很远?

4

1 回答 1

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
于 2014-11-18T20:16:52.290 回答