b-spline python_基于numpy/scipy的快速bspline算法

所以,在我的问题困扰了很多,做了很多研究之后,我终于有了答案。scipy中的所有东西都是可用的,我把我的代码放在这里,希望其他人能发现它有用。在

该函数接受一个N-d点数组、一个曲线阶数、一个周期状态(打开或关闭),并将沿着该曲线返回N个样本。有一些方法可以确保曲线样本是等距的,但目前我将集中讨论这个问题,因为它都是关于速度的。在

值得注意的是:我似乎无法超越20度的曲线。当然,这已经是过火了,但我觉得值得一提。在

同样值得注意的是:在我的机器上,下面的代码可以在0.017s内计算出100000个样本import numpy as np

import scipy.interpolate as si

def bspline(cv, n=100, degree=3, periodic=False):

""" Calculate n samples on a bspline

cv : Array ov control vertices

n : Number of samples to return

degree: Curve degree

periodic: True - Curve is closed

False - Curve is open

"""

# If periodic, extend the point array by count+degree+1

cv = np.asarray(cv)

count = len(cv)

if periodic:

factor, fraction = divmod(c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B样条拟合曲线可以使用Python中的SciPy库中的interpolate模块来实现。这个模块提供了一个名为`make_interp_spline`的函数,可以用来创建B样条插值器。 首先,要生成样本数据。这里假设我们有一组x和y的数据。 ```python import numpy as np # Generate sample data x = np.linspace(0, 10, 10) y = np.sin(x) ``` 然后,使用`make_interp_spline`函数创建B样条插值器。 ```python from scipy.interpolate import make_interp_spline # Create B-spline interpolator spl = make_interp_spline(x, y) ``` 这样我们就创建了一个B样条插值器`spl`。现在可以使用这个插值器来生成平滑的曲线。 ```python import matplotlib.pyplot as plt # Generate smooth curve x_smooth = np.linspace(0, 10, 100) y_smooth = spl(x_smooth) # Plot original data and smooth curve plt.plot(x, y, 'o', label='Data') plt.plot(x_smooth, y_smooth, label='B-spline') plt.legend() plt.show() ``` 现在我们已经生成了平滑的曲线。如果要将B样条插值器保存到文件中,可以使用Python的pickle模块。这个模块可以将Python对象序列化并保存到文件中。在稍后需要时,可以从文件中读取对象并反序列化为Python对象。 ```python import pickle # Save B-spline interpolator to file with open('bspline.pkl', 'wb') as f: pickle.dump(spl, f) ``` 这样,B样条插值器`spl`就被保存到了文件`bspline.pkl`中。稍后需要时,可以从文件中读取插值器并使用它来生成曲线。 ```python # Load B-spline interpolator from file with open('bspline.pkl', 'rb') as f: spl = pickle.load(f) # Generate smooth curve x_smooth = np.linspace(0, 10, 100) y_smooth = spl(x_smooth) # Plot smooth curve plt.plot(x_smooth, y_smooth) plt.show() ``` 这样,我们就可以从文件中加载B样条插值器并使用它来生成曲线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值