代码之家  ›  专栏  ›  技术社区  ›  Ram

Nurbs曲线(2D)定长参数化

  •  0
  • Ram  · 技术社区  · 6 年前

    我有一个代表二维Nurbs曲线的类

    类Nurbs2D{…};

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

    API:我能够构造t0&t1。我还能够计算给定参数t(t0<=t<=t1)的点2d。

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

    C++中的代码将非常有用。我正在寻找速度超过精度,因为调整公差dt将使结果符合要求。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nico Schertler    6 年前

    计算NURBS曲线的弧长相当复杂。需要对两个给定参数值之间的差分长度进行积分。即使对于简单的二次B样条曲线,这也会变得很混乱,如图1所示 this question .

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

    为了得到一点 dl 当前点前的长度单位 t ,你可以做类似的事情:选择一个小增量 dt 并评估该间距中的点(即。, t, t + dt, t + 2dt, t + 3dt ... )测量多段线的长度,直到达到目标长度。如果你在最后一段时间内射向目标,你可以减少射程 dt 直到达到要求的精度。