如何沿贝塞尔曲线沿路径长度按设定比例对点进行采样

时间:2019-07-14 05:57:32

标签: bezier polyline

我有一条由二次贝塞尔曲线和直线段组成的路径。该路径可能不一定是连续的,因为该路径可能还包含“ MOVETO”语句,这些语句将当前行的起点设置为空间中的另一个点。

在给定间隔[0,1]中的值的列表的情况下,我想沿该路径采样点。提供的值列表代表行进路径的比例。

我想到的方法是将“全局”值列表转换为局部t值,从中可以沿曲线/直线进行插值。但是,我对此方法有疑问。

例如,如果“全局”值列表为

[0, 0.2, 0.4, 0.6, 0.8, 1]

,沿曲线起点和终点之间的直线行进的距离列表为

[0, 0.1, 0.3, 0.55, 0.7, 0.75, 0.9, 0.9, 1]

“本地” t值的列表应为

[0, 0.5, 0.4, 0.33, 0.33, 1]

有没有简单的方法可以做到这一点?我觉得这让我变得不必要了。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

简短的回答:简单吗?绝对。 “使用简单的公式”?没有。

更长的答案:您要执行的操作称为通过弧长重新设置曲线的参数(将时间,屈服距离的非线性方程式转换为距离,屈服时间的线性方程式),不幸的是,对于任何情况,这都是不可能的Bezier曲线除了一个:已经是线性的Bezier曲线(因此,重新参数化在这种情况下毫无意义)。

关于该主题的论文很多,它们试图找出您可以使用的罐子的情况,或者试图通过分段解决的方式来解决该问题,但是:当您拥有计算机时,最直接的方法是只是“尝试超过您想要的t值,丢弃不需要的t值”,例如https://pomax.github.io/bezierinfo/#tracing的想法是您计算沿曲线的多个t值(例如,其中的100个)的曲线的弧长,并将“沿曲线映射到时间值t的距离d”信息存储在查找表。然后您忽略实际曲线本身,然后根据该查找表找到t个值:

假设您需要沿着曲线的距离0.522的t值。您的LUT具有d0.52 = t0.44和d0.53 = t.0.45,因此您猜测:d0.522 = 0.8 * 0.44 + 0.2 * 0.45(例如线性比),得到t = 0.442,然后计算该t值的弧长,方法与计算弧长以建立LUT的方法相同

如果它“足够接近”(基于一些小错误,例如“像素不足”),就可以完成。如果不是,那么您现在就可以开始小幅度地校正t值了(只是沿值上下移动,或者使用二进制搜索,这很容易实现)。