Python 如何在SciPy中沿三维样条曲线查找点?

Python 如何在SciPy中沿三维样条曲线查找点?,python,scipy,spline,Python,Scipy,Spline,我想画一条这样的曲线: 三维曲线,在空间中有3个点定义了曲线通过的端点和中点,但在空间中也有2个点,曲线在不接触的情况下向其弯曲 与在Inkscape中使用二维点定义曲线类似: 另外,我想计算沿着这条曲线的点,这些点沿空间的x维度等距分布。(沿定义样条曲线的t变量的间距不相等,沿曲线长度的间距也不相等。曲线不会沿x维度回溯。) 我试过阅读,但我感到困惑。它显示通过所有点的曲线: 或者没有: 下面是一段代码,它使用python软件包沿一条直线获取点 为了获得“沿该曲线沿x尺寸等距分布”的点,

我想画一条这样的曲线:

三维曲线,在空间中有3个点定义了曲线通过的端点和中点,但在空间中也有2个点,曲线在不接触的情况下向其弯曲

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

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

我试过阅读,但我感到困惑。它显示通过所有点的曲线:

或者没有:

下面是一段代码,它使用python软件包沿一条直线获取点

为了获得“沿该曲线沿x尺寸等距分布”的点,使用以下方法执行线性插值。 对于所需的每个坐标
x
,将插值相应的曲线坐标
t
。然后,使用
曲线获得
t
处点的坐标。再次求值

该示例是二维的,但应通过定义三维
节点
坐标在三维中工作

%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();

下面是一段代码,它使用python软件包沿一条直线获取点

为了获得“沿该曲线沿x尺寸等距分布”的点,使用以下方法执行线性插值。 对于所需的每个坐标
x
,将插值相应的曲线坐标
t
。然后,使用
曲线获得
t
处点的坐标。再次求值

该示例是二维的,但应通过定义三维
节点
坐标在三维中工作

%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();

我的猜测是,您在寻找贝塞尔样条曲线,而Scipy的插值例程没有任何控制(或弯曲)点的概念,而是插值样条曲线。“你看了看它是否能解决你的问题吗?”@Ahmedfashi是的,我看了这个问题。根据我读到的一些文章,SciPy有B样条曲线,Bezier是B样条曲线的一种。我可能错了,但我相信SciPy实现的B样条曲线是样条曲线的插值理论方法,而Bezier曲线(你的目标是,控制点导致曲线向它们弯曲)是图形中使用的一种更具体的样条曲线。我试图解释的方式是:在插值中,没有理由使用控制点来引导曲线,因此如果
scipy.interpolate.BSpline
可以满足您的需要,我会感到惊讶。@user6655984正在试图找到最接近一组数据的控制点。我试图从控制点实现曲线本身。我猜你是在追求贝塞尔样条曲线,而Scipy的插值例程没有任何控制(或弯曲)点的概念,而是插值样条曲线。“你看了看它是否能解决你的问题吗?”@Ahmedfashi是的,我看了这个问题。根据我读到的一些文章,SciPy有B样条曲线,Bezier是B样条曲线的一种。我可能错了,但我相信SciPy实现的B样条曲线是样条曲线的插值理论方法,而Bezier曲线(你的目标是,控制点导致曲线向它们弯曲)是图形中使用的一种更具体的样条曲线。我试图解释的方式是:在插值中,没有理由使用控制点来引导曲线,因此如果
scipy.interpolate.BSpline
可以满足您的需要,我会感到惊讶。@user6655984正在试图找到最接近一组数据的控制点。我正在尝试从控制点实现曲线本身。我认为这将解决我的问题!谢谢(我不认为关于t是曲线的评论是正确的,但是,我认为t的间距沿弧长变化。)@endolith:没错,
t
在曲线上是不均匀的,我不知道怎么称呼它。。。如果你想要沿着曲线有规则的间隔点,我认为精确的距离必须被积分,并使用类似的插值来代替
x
我认为这将解决我的问题!谢谢(我不认为关于t是曲线的评论是正确的,但是,我认为t的间距沿弧长变化。)@endolith:没错,
t
在曲线上是不均匀的,我不知道怎么称呼它。。。如果你想要沿着曲线有规则的间隔点,我认为精确的距离必须被积分,并使用类似的插值来代替
x