贝塞尔曲线的均匀离散化

4
我需要将一个由四个点p0、p1、p2和p3定义的三阶Bezier曲线离散化,使得曲线上的点等距分布。曲线上的任意点p(t)(其中0 < t < 1)由以下公式给出:
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算法递归地将Bezier曲线减半,直到达到所需的精度,但这将需要大量的距离计算。
有什么办法可以通过分析来解决这个问题吗?

你所寻找的也被称为“弧长参数化”。一般来说,如果你在“默认参数化”的固定间隔处细分贝塞尔曲线,得到的曲线段将不具有相同的弧长。这里有一种方法可以实现 http://pomax.github.io/bezierinfo/#tracing。 - hkrish
非常感谢 @hkrish!采样距离(t)和插值是解决问题的一种非常优雅的方式。我正在测试它。请随意将其添加为答案,以便我可以接受它。 - Nic
你是指常数直线(弦)还是曲线距离? - user1196549

Yves 我的意思是曲线距离

- Nic
1个回答

2
你所寻找的被称为“弧长参数化”。一般来说,如果按照默认参数化在固定间隔处细分贝塞尔曲线,则生成的曲线段将没有相同的弧长。这里是一种方法http://pomax.github.io/bezierinfo/#tracing。前段时间,我在玩一个需要点尽可能均匀分布的代码(曲率流)。这里是使用线性插值和单调三次样条插值从相同的积分样本集(我每个曲线使用20个样本,每个样本使用24点高斯-勒让德积分法进行评估)重新参数化立方体曲线的比较(轴上未正确标记! ;))。

enter image description here

[请注意,这是与使用更多节点和采用作为“基本事实”的样本运行算法进行比较的结果。]
这里有一个演示, 使用单调三次插值重新参数化曲线。函数Curve.getLength是积分函数。

1
你是否有关于这个问题的博客文章?我很想在贝塞尔曲线入门指南中添加立方插值作为线性插值的替代方法。 - Mike 'Pomax' Kamermans
谢谢。这是基于任何已发布的文章或其他可以引用为来源的工作吗? - Mike 'Pomax' Kamermans
基本插值思想类似于三次Hermite插值。我认为,我从这里http://de.mathworks.com/matlabcentral/fileexchange/1814-akima-interpolation(BSD许可证)中获取了插值部分。虽然我们不需要斜率估计部分;这里是Akima的方法或者像维基百科文章中所述的Fritsch&Carlson的方法。我们直接获得了斜率,因此我在Akima的方法中替换了dt / dl。 - hkrish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接