0

我有一个代表 2D Nurbs 曲线的类

类 Nurbs2D {...};

数据成员是控制点(Point2D 的std::vector)、节点向量(std::vector of double)、权重(std::vector of double)、度数(基于控制点的数量和节点向量)

API:我能够构建在 t0 和 t1 之间参数化的曲线。给定参数 t (t0 <= t <= t1),我还能够计算 Point2D。

给定一个参数 ti,我想估计下一个参数 ti+1,这样从 ti 到 ti+1 的曲线上的距离等于 Di(假设 Di 在公差 dt 内)。需要两个函数,一个计算从 ti 到 ti+1 的长度,另一个在给定 ti、Di 和 dt 的情况下估计 ti+1。

C++ 中的代码将非常有用。我正在寻找速度而不是准确性,因为调整容差 dt 将使结果适合。

4

1 回答 1

1

计算 NURBS 曲线的弧长非常复杂。您需要整合两个给定参数值之间的差异长度。正如您在这个问题中看到的那样,即使对于简单的二次 B 样条曲线,这也会变得混乱。

由于您不关注准确性,因此以数字方式近似长度可能就足够了。Math.SE 问题下的一个答案指出了您可以采用的细分方案。您可以将其扩展到 NURBS。但是,一种更简单的方法可能同样适合您的应用程序:只需在您感兴趣的间隔内的多个均匀间隔的采样点处评估曲线。然后,计算此采样的折线的长度。这种方法可以通过改变基于曲率的采样密度来改进。但是统一的方法可能对您来说足够好。准确度与您使用的样本数量相关。

要获得一个dl比当前点早于长度单位的点t,您可以执行类似的操作:选择一个小增量dt并评估该间距中的点(即t, t + dt, t + 2dt, t + 3dt ...),同时测量折线的长度,直到达到您的目标长度。如果您在最后一个间隔内射过目标,则可以减少dt最后一部分,直到达到所需的精度。

于 2018-09-03T07:00:51.790 回答