您需要的是De Casteljau 算法。这将允许您将曲线分割成您想要的任何部分。
但是,由于您只处理三次曲线,我想建议一个更容易使用的公式,它可以为您提供一个从wheret0
到t1
where的段0 <= t0 <= t1 <= 1
。这是一些伪代码:
u0 = 1.0 - t0
u1 = 1.0 - t1
qxa = x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0
qxb = x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1
qxc = bx1*u0*u0 + bx2*2*t0*u0 + x2*t0*t0
qxd = bx1*u1*u1 + bx2*2*t1*u1 + x2*t1*t1
qya = y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0
qyb = y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1
qyc = by1*u0*u0 + by2*2*t0*u0 + y2*t0*t0
qyd = by1*u1*u1 + by2*2*t1*u1 + y2*t1*t1
xa = qxa*u0 + qxc*t0
xb = qxa*u1 + qxc*t1
xc = qxb*u0 + qxd*t0
xd = qxb*u1 + qxd*t1
ya = qya*u0 + qyc*t0
yb = qya*u1 + qyc*t1
yc = qyb*u0 + qyd*t0
yd = qyb*u1 + qyd*t1
然后只需绘制由 、 和 组成(xa,ya)
的(xb,yb)
贝塞尔(xc,yc)
曲线(xd,yd)
。
请注意,t0
和t1
不完全是曲线距离的百分比,而是曲线参数空间的百分比。如果您绝对必须保持距离,那么事情就会变得更加困难。试试这个,看看它是否满足您的需求。
编辑:值得注意的是,如果t0
ort1
为 0 或 1(即您只想从一侧修剪),这些方程式会简化很多。
此外,这种关系0 <= t0 <= t1 <= 1
不是严格的要求。例如t0 = 1
, 和t1 = 0
可用于向后“翻转”曲线,或t0 = 0
可t1 = 1.5
用于将曲线延伸到原始末端。但是,如果您尝试将其扩展到该[0,1]
范围之外,则该曲线可能看起来与您预期的不同。
Edit2:在我最初回答 3 年多之后,MvG 指出了我的方程式中的一个错误。我忘记了最后一步(获得最终控制点的额外线性插值)。上述等式已更正。