【问题标题】:How to find points along a 3D spline curve in SciPy?如何在 SciPy 中沿 3D 样条曲线查找点?
【发布时间】:2018-08-11 19:29:44
【问题描述】:

我想做这样的曲线:

一条 3D 曲线,空间中的 3 个点定义了曲线通过的终点和中间点,还有空间中的 2 个点,曲线在不接触的情况下弯曲。

类似于在 Inkscape 中使用二维点定义曲线:

此外,我想计算沿该曲线沿空间的 x 维度等距分布的点。 (沿定义样条的 t 变量不等间距,沿曲线长度不等间距。曲线不会沿 x 维度回溯。)

我试过阅读the documentation,但我很困惑。它要么显示通过所有点的曲线:

或者没有:

【问题讨论】:

  • 我的猜测是你在使用 Bezier 样条曲线,而 Scipy 的插值程序没有任何控制(或弯曲)点的概念——相反,它们是插值样条曲线。你看过stackoverflow.com/questions/12643079/…看它是否能解决你的问题?
  • @AhmedFasih 是的,我已经看到了这个问题。根据我阅读的一些文章,SciPy 有 B 样条,而 Beziers 是 B 样条的一种。
  • 我对此可能是错的,但我相信 Scipy 实现的 B 样条曲线是样条曲线的插值理论方法,而贝塞尔曲线(你的目标是,控制点导致向它们弯曲的曲线)是图形中使用的一种更具体的样条线。我试图解释它的方式是:在插值中,没有理由让控制点引导曲线,所以如果scipy.interpolate.BSpline 会在这里做你需要的事情,我会感到惊讶。
  • @user6655984 stackoverflow.com/q/12643079/125507 正在尝试找到最接近一组数据的控制点。我正在尝试从控制点实现 曲线本身

标签: python scipy spline


【解决方案1】:

这是使用bezier python 包沿Bezier curve 获取点的代码。

为了获得“沿这条曲线沿 x 维度等距分布”的点,使用numpy.interp 执行线性插值。 对于每个想要的坐标x,相应的曲线坐标t 被插值。然后再次使用curve.evaluate_multi获取t点的坐标。

该示例是 2D 的,但应该通过定义 3D nodes 坐标在 3D 中工作。

%matplotlib inline
import matplotlib.pylab as plt

import bezier
import numpy as np

# Define the Bezier curve
nodes = np.array([
        [0.0, 0.2, 1.0, 2.0],
        [0.0, 1.8, 0.3, 0.5] ])

curve = bezier.Curve(nodes, degree=3)

t_fine = np.linspace(0, 1, 60) # Curvilinear coordinate
points_fine = curve.evaluate_multi(t_fine)
points_fine.shape  # (2, 60)

# Interpolation on regular x coordinates
x_xregular = np.linspace(0, 2, 7)

t_xregular = np.interp(x_xregular, points_fine[0], t_fine)
points_xregular = curve.evaluate_multi(t_xregular)

# Plot
plt.plot(*nodes, '-o', label='definition nodes');
plt.plot(*points_fine, label='Bezier curve');
plt.plot(*points_xregular, 'ok', label='regularly spaced along x');
plt.xlabel('x'); plt.ylabel('y'); plt.legend();

【讨论】:

  • 我想这会解决我的问题!谢谢! (我不认为关于 t 是曲线的评论是正确的,但我认为 t 的间距沿弧长变化。)
  • @endolith: 没错,t 沿曲线不均匀,我不知道如何称呼它...如果您希望沿曲线有规律地间隔点,我认为必须对精确距离进行积分,并使用与距离而不是 x 的类似插值
猜你喜欢
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2014-12-30
相关资源
最近更新 更多