微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python将3D样条曲线拆分为等距欧几里得点

如何解决python将3D样条曲线拆分为等距欧几里得点

我有一组代表 3D 曲线的点。 我有许多链接/段 (n) 及其长度 (L)。

我想将 3D 曲线(从曲线的第一个点开始)分成 n 段,因此它们之间的欧氏距离为 L。曲线比n段长,所以段的最后一个不是在曲线的末端。

我目前有一个解决方案,但它没有优化并且需要大量时间来计算(~110ms),使用 python3.6

这是我目前的解决方案:

  1. 我正在使用 scipy.interpolate.splprep 创建 3D 曲线
  2. 从参数 u=0 开始,我使用 Bisection method 查找下一个 u 值,该值会给我一个位于L 到第一个点的距离
  3. 重复这些步骤,直到找到所有的 n 个片段

这是我编写的函数

  • self.epsilon - 点之间距离的允许误差
  • self.link_N = 段/链接
  • self.link_L - 段/链接的长度
def split_curve(self,curve):
    joint_pos = curve[:,0].reshape(3,1)
    tck,u = sc.splprep(curve,k=2,s=0)
    a = 0
    prev_pos = joint_pos
    for i in range(self.link_N-1):
        iter_count = 0
        b = 1
        error = self.epsilon + 1
        while np.abs(error) > self.epsilon and iter_count < self.iter_max:
            iter_count += 1
            c = (a+b)/2
            temp_pos = np.asarray([sc.splev(c,tck)]).T
            error = self.link_L - np.linalg.norm(temp_pos - prev_pos)
            if error > 0:
                a = c
            else:
                b = c
        u = c
        joint_pos = np.hstack((joint_pos,temp_pos))
        prev_pos = temp_pos
    return joint_pos

我的曲线变化很快(大约 100-150hz),这个函数(大约需要 100 毫秒来计算)让我慢下来。 有没有比二分法更好的解决方案?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。