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

Posted

技术标签:

【中文标题】计算单元化三次贝塞尔曲线的多项式系数【英文标题】:Calculating polynomial coefficients for unitized cubic bezier curve 【发布时间】:2014-11-18 18:27:08 【问题描述】:

我正在分析 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 的?还是我离基地太远了?

【问题讨论】:

【参考方案1】:

经过一番折腾,我弄清楚了发生了什么。

乘以上面的多项式将简化为:

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

【讨论】:

你是正确的。扩展到幂基础,然后解析。

以上是关于计算单元化三次贝塞尔曲线的多项式系数的主要内容,如果未能解决你的问题,请参考以下文章

贝塞尔曲线的几个知识点

iOS世界里的贝塞尔曲线(一):贝塞尔曲线基础

matlab练习程序(贝塞尔曲线)

计算三次贝塞尔曲线的最快方法?

三次方贝塞尔曲线的绘制

matlab练习程序(均匀B样条)