我有一个代表2D Nurbs曲线的类
Nurbs2D类{...};
数据成员是控制点(Point2D的std :: vector),结向量(std :: double的向量),权重(std :: double的向量),度(根据控制点和结的数量表示)向量)
API:我能够构造在t0和t1之间参数化的曲线。给定参数t(t0 <= t <= t1),我也能够计算Point2D。
给定参数ti,我想估计下一个参数ti + 1,以使从ti到ti + 1沿曲线的距离等于Di(在公差dt内给定Di)。需要两个函数,一个函数计算从ti到ti + 1的长度,另一个函数在给定ti,Di和dt的情况下估计ti + 1。
C ++中的代码将非常有用。我正在寻找速度超过精度的问题,因为调整公差dt可以使结果合适。
答案 0 :(得分:1)
计算NURBS曲线的弧长非常复杂。您需要积分两个给定参数值之间的差值长度。就像您在this question中看到的那样,即使对于简单的二次B样条曲线也是如此。
由于您不关注精度,因此大概可以用数字近似长度。 Math.SE问题下的答案之一是您可以采用的细分方案。您可以将此扩展到NURBS。但是,更简单的方法可能也适合您的应用:只需在您感兴趣的间隔内的多个均匀间隔的采样点处评估曲线。然后,计算此采样的折线的长度。通过基于曲率更改采样密度可以改进此方法。但是统一的方法可能对您来说足够好。准确性与您使用的样本数量相关。
要获得比当前点dl
早t
个长度单位的点,您可以执行类似的操作:选择一个小的增量dt
并评估该间距中的点(即t, t + dt, t + 2dt, t + 3dt ...
),同时测量折线的长度,直到达到目标长度为止。如果您在最后一个间隔内越过目标,则可以减少最后一部分的dt
,直到达到要求的精度。