【问题标题】:How to sample points along a bezier path at set proportions along the path length如何沿路径长度以设定的比例沿贝塞尔路径采样点
【发布时间】:2019-11-23 06:47:53
【问题描述】:

我有一条由二次贝塞尔曲线和直线段组合而成的路径。路径不一定是连续的,因为路径还可能包含“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]

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

任何帮助将不胜感激。

【问题讨论】:

    标签: bezier polyline


    【解决方案1】:

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

    更长的答案:您尝试做的是通过弧长重新参数化曲线(将非线性时间方程,产生距离,变成线性距离方程,产生时间)不幸的是,这对于任何人来说都是象征性的贝塞尔曲线除了一个:已经是线性的贝塞尔曲线(所以重新参数化对于这种情况来说是没有意义的)。

    有很多关于这个主题的论文试图找出你可以解决的情况,或者尝试通过分段解决问题来解决这个问题,但是:当你有一台计算机时,最直接的方法是只是“尝试比你想要的更多的 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 值向上或向下修正一小部分(或者只是向上/向下移动这些值,或者使用二分查找,这很容易实现)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多