我想画一条这样的曲线:
3D曲线,在空间中有3个点定义了曲线的终点和中间点,在空间中还有2个点,曲线在不接触的情况下向弯曲。
类似于在Inkscape中使用2D点定义曲线:
此外,我想计算沿着这条曲线沿点的x维度等距分布的点。 (沿定义样条曲线的t变量不等距,并且沿曲线长度不等距。曲线不会沿x维度回退。)
我尝试阅读the documentation,但感到困惑。它要么显示通过所有点的曲线:
或没有一个:
答案 0 :(得分:2)
这是一个使用bezier
python程序包在Bezier curve上获取点的代码。
要获得点“沿着这条曲线沿x方向等距分布”,可以使用numpy.interp
进行线性插值。
对于每个想要的坐标x
,都会插入相应的曲线坐标t
。然后,再次使用t
获得curve.evaluate_multi
点的坐标。
该示例在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();