使用python编写的准均匀三次b样条曲线程序

使用python 编写准均匀三次b样条曲线程序,并绘图

要使用Python编写准均匀三次B样条曲线程序并绘制图形,我们需要使用一些外部库,如NumPy和Matplotlib。以下是一个简单的示例来演示如何生成准均匀三次B样条曲线并绘制图形。

1. 首先,确保安装了NumPy和Matplotlib库。你可以使用以下命令安装它们

pip install numpy matplotlib

2. 接下来,创建一个Python脚本并导入所需库:

import numpy as np
import matplotlib.pyplot as plt

3.定义一个函数来计算准均匀三次B样条曲线的基函数。这里使用的是De Boor-Cox递归公式:

def de_boor_cox(x, k, i, t):
    if k == 0:
        return 1.0 if t[i] <= x < t[i+1] else 0.0
    else:
        num1 = (x - t[i]) * de_boor_cox(x, k-1, i, t)
        num2 = (t[i+k+1] - x) * de_boor_cox(x, k-1, i+1, t)
        den1 = t[i+k] - t[i]
        den2 = t[i+k+1] - t[i+1]
        term1 = num1 / den1 if den1 != 0 else 0
        term2 = num2 / den2 if den2 != 0 else 0
        return term1 + term2

4.定义一个函数来计算准均匀三次B样条曲线:

"""quasi-uniform b-spline curve"""
def cubic_bspline(t, control_points):
    n = len(control_points)
    k = 3
    x_points = []
    y_points = []

    for x in np.arange(t[k], t[-k-1], 0.01):
        x_point = 0
        y_point = 0
        for i in range(n):
            b = de_boor_cox(x, k, i, t)
            x_point += control_points[i][0] * b
            y_point += control_points[i][1] * b
        x_points.append(x_point)
        y_points.append(y_point)

    return x_points, y_points


5.定义一个函数来绘制准均匀三次B样条曲线:

def plot_bspline(control_points, x_points, y_points):
    control_points = np.array(control_points)

    plt.plot(control_points[:, 0], control_points[:, 1], 'ro-', label='Control Points')
    plt.plot(x_points, y_points, 'b-', label='B-spline Curve')

    plt.legend()
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.title('Cubic B-spline Curve')
    plt.grid()
    plt.show()

"""plot t - f(t), x(t),y(t) """
def plot_points(t_v1,points,title = ""):
    plt.figure()
    plt.plot(t_v1, points, 'b-')
    plt.xlabel('t')
    plt.ylabel('f(t)')
    plt.title(title)
    plt.grid()

6.定义一个函数来绘制准均匀三次B样条曲线:

if __name__ == "__main__":
    control_points = [(0, 0), (2, 3), (4, 3), (6, 0), (8, -3), (10, -3)]
    n = len(control_points)
    k = 3

    # 生成均匀节点向量  len(t) ==  k + n - k + 1 + k  == k + n + 1
    t = np.concatenate((np.zeros(k), np.arange(n - k + 1), np.ones(k) * (n - k)), axis=0)
     print("t = ",t) #t =  [0. 0. 0. 0. 1. 2. 3. 3. 3. 3.]

    # 计算B样条曲线上的点
    x_points, y_points = cubic_bspline(t, control_points)

    # 绘制曲线
    plot_bspline(control_points, x_points, y_points)
    
	t_v1 = np.arange(t[k], t[-k - 1], 0.01)
    plot_points(t_v1,x_points,"t - x(t)")
    plot_points(t_v1,y_points,"t - y(t)")
    plt.show()

在这里插入图片描述
准均匀三次b样条曲线
在这里插入图片描述

现在,我们已经完成了使用Python编写的准均匀三次B样条曲线程序。当你运行这个程序时,它将使用给定的控制点计算曲线上的点,并使用Matplotlib库绘制曲线和控制点。在这个示例中,我们为曲线指定了一组控制点,但你可以根据需要更改控制点以生成不同的曲线。

注意,这个示例假设你已经安装了NumPy和Matplotlib库。如果你没有安装这些库,请参考上一部分的步骤1来安装它们。

参考

链接: B样条曲线(B-spline Curves)
链接: 运动规划——B样条曲线)

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
B样条曲线是一种用于插值和逼近的数学曲线,常用于计算机图形学和计算机辅助设计中。在Python中,我们可以使用`scipy.interpolate`模块中的`splrep`和`splev`函数来生成和绘制B样条曲线。 首先,我们需要导入相应的库: ```python import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import splrep, splev ``` 接下来,我们可以生成一些用于构建B样条曲线的控制点。这些控制点应按顺序排列,并且至少需要四个点才能形成一个B样条曲线。我们可以使用`numpy.array`来定义这些点的坐标。 ```python # 定义控制点 x = np.array([0, 1, 2, 3, 4]) y = np.array([0, 3, 1, 2, 0]) ``` 然后,我们可以使用`splrep`函数生成一条次数为3的B样条曲线。该函数的返回值是一个包含插值节点、B样条系数和曲线次数的元组。 ```python # 生成B样条曲线 tck, u = splrep(x, y, k=3) ``` 最后,我们可以使用`splev`函数来根据插值节点、B样条系数和曲线次数生成实际的曲线点坐标,并使用`matplotlib.pyplot`库中的`plot`函数绘制出B样条曲线。 ```python # 生成曲线点坐标 x_new = np.linspace(x.min(), x.max(), 500) y_new = splev(x_new, tck) # 绘制B样条曲线 plt.plot(x_new, y_new) plt.scatter(x, y, c='r') plt.xlabel('x') plt.ylabel('y') plt.title('B-spline Curve') plt.grid(True) plt.show() ``` 以上就是使用Python生成和显示三次B样条曲线的简单示例。根据需要,你可以自行调整控制点的坐标和曲线次数来生成不同的B样条曲线

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyb_cqu

您的鼓励,是我持续创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值