我需要对具有沿曲线均匀分布的点的三阶贝塞尔曲线进行离散化。曲线由四个点p0,p1,p2,p3和一般点p(t)定义,其中0 <0。 t&lt; 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递归地将贝塞尔曲线减半到所需的分辨率,但这需要大量的距离计算。
有关如何解析这个问题的任何想法吗?
答案 0 :(得分:1)
您正在寻找的内容也称为“弧长参数化”。
通常,如果以默认参数化的固定间隔细分贝塞尔曲线,则生成的曲线段将不具有相同的弧长。这是一种方法http://pomax.github.io/bezierinfo/#tracing。
前段时间,我正在玩一些代码(曲率流),这些代码需要尽可能均匀地分开点。这是一个比较(在轴上没有适当的标记!;))使用线性插值和来自同一组正交样本的monotone cubic interpolation(我使用每个曲线20个样本,每个使用24点高斯 - 图例 - 正交评估)重新构造一个三次曲线。
[请注意,这与使用更多节点和样本作为基础事实的算法的另一次运行进行比较。]
这是demo使用单调立方插值来重新构造曲线。函数Curve.getLength是正交函数。