贝塞尔曲线的均匀离散化

Uniform discretization of Bezier curve

我需要用沿曲线均匀分布的点来离散化三阶贝塞尔曲线。该曲线由四个点 p0、p1、p2、p3 和一个通用点 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 algorithm 的贝塞尔曲线减半到所需的分辨率,但这需要大量的距离计算。

关于如何解析地解决这个问题有什么想法吗?

您要找的也叫"arc-length parametrisation"。

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

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

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

这里有个demo using monotone cubic interpolation to reparametrise a curve. The function Curve.getLength是求积函数