计算单元化三次贝塞尔曲线的多项式系数
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
【讨论】:
你是正确的。扩展到幂基础,然后解析。以上是关于计算单元化三次贝塞尔曲线的多项式系数的主要内容,如果未能解决你的问题,请参考以下文章