【问题标题】:Uniform discretization of Bezier curve贝塞尔曲线的均匀离散化
【发布时间】:2016-02-08 16:59:03
【问题描述】:

我需要离散化一条三阶贝塞尔曲线,点沿曲线均匀分布。曲线由四个点 p0、p1、p2、p3 定义,0

point_t = (1 - t) * (1 - t) * (1 - t) * p0 + 3 * (1 - t) * (1 - t) * t * p1 + 3 * (1 - t) * t * t * p2 + t * t * t * p3;

我的第一个想法是离散化 t = 0, t_1, ... t_n, ..., 1

这不起作用,因为一般来说,我们最终不会得到离散点之间的统一距离。

总而言之,我需要的是一种离散化参数曲线的算法,以便:

|| p(t_n) - p(t_n_+_1) || = d

我曾考虑使用Casteljau algorithm 将贝塞尔曲线递归地减半,直至达到所需的分辨率,但这需要大量的距离计算。

关于如何分析解决这个问题的任何想法?

【问题讨论】:

  • 您正在寻找的也称为“弧长参数化”。通常,如果您以“默认参数化”的固定间隔细分贝塞尔曲线,则生成的曲线段将不会具有相同的弧长。这是一种方法pomax.github.io/bezierinfo/#tracing
  • 非常感谢@hkrish!采样距离(t)和插值是解决问题的一种非常优雅的方法。我正在测试它。随意添加这个作为答案,以便我可以接受它
  • 你的意思是恒定的直线(弦)距离还是曲线距离?
  • #Yves 我的意思是曲线距离

标签: path computational-geometry spline bezier


【解决方案1】:

您正在寻找的也称为“弧长参数化”。

一般来说,如果您以默认参数化的固定间隔细分贝塞尔曲线,则生成的曲线段将不会具有相同的弧长。这是http://pomax.github.io/bezierinfo/#tracing的一种方法。

前段时间,我在玩一些代码(曲率流),需要尽可能均匀地分隔点。这是一个比较(没有在轴上正确标记!;))使用线性插值和来自同一组正交样本的monotone cubic interpolation(我每条曲线使用 20 个样本,每个样本都使用 24 点高斯图例正交进行评估)重新参数化三次曲线。

[请注意,这是与使用更多节点和样本作为ground truth的另一次算法运行进行比较的。]

这是一个 demo 使用单调三次插值来重新参数化曲线。函数Curve.getLength是求积函数。

【讨论】:

  • 您是否碰巧在某处有关于此的博客文章?我很想在 Bezier 曲线上的 Primer 中添加三次插值作为线性插值的替代方法。
  • 谢谢。这是基于任何已发表的文章或其他可以作为来源引用的作品吗?
  • 基本插值思想类似于三次厄米特插值。我想,我从这里de.mathworks.com/matlabcentral/fileexchange/…(BSD 许可)获取了插值部分。虽然我们不需要斜率估计部分;这是 Akima 的方法或类似维基百科文章中的 Fritsch&Carlson 的方法。我们有直接可用的斜率,所以我用 Akima 的方法替换了 dt/dl。
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2018-12-03
  • 1970-01-01
  • 2013-01-21
相关资源
最近更新 更多