贝塞尔曲线(分析+python源码)

本文详细解析了用于计算和绘制贝塞尔曲线的Python代码,包括Bezier函数的递推公式和runBezier函数的使用方法,以及控制点和阶数对曲线形状的影响。
摘要由CSDN通过智能技术生成

贝塞尔曲线代码分析

1. 代码功能:

该代码用于计算和绘制贝塞尔曲线。

2. 代码解释:

2.1 函数 Bezier:

  • 该函数用于计算贝塞尔曲线在参数值 t 处的点坐标。
  • 输入参数:
    • t: 参数值,范围为 [0, 1]
    • points: 控制点列表,控制点的个数决定了贝塞尔曲线的阶数
  • 输出:
    • 贝塞尔曲线在参数值 t 处的点坐标

2.2 函数 runBezier:

  • 该函数用于绘制贝塞尔曲线。
  • 输入参数:
    • x: x 方向控制点列表
    • y: y 方向控制点列表
    • n: 曲线段数,用于控制曲线的精度
  • 输出:
    • xs: 贝塞尔曲线 x 坐标列表
    • ys: 贝塞尔曲线 y 坐标列表

2.3 代码细节:

  • 函数 Bezier 使用了递推公式计算贝塞尔基函数的值。
  • 函数 runBezier 使用 np.linspace 函数生成参数值列表,然后使用 Bezier 函数计算每个参数值处的点坐标,最后将这些点坐标连接起来形成贝塞尔曲线。

3. 注意事项:

  • 贝塞尔曲线的阶数由控制点的个数决定。控制点越多,曲线的阶数越高,曲线越平滑。
  • 贝塞尔曲线的形状由控制点的位置决定。控制点的 x 坐标决定曲线的 x 方向形状,控制点的 y 坐标决定曲线的 y 方向形状。

4. 总结:

该代码提供了一种简单的方法来计算和绘制贝塞尔曲线。您可以修改代码来创建不同的贝塞尔曲线。

5. 测试效果(红色为控制节点,蓝线为内赛尔曲线):

附:完整源代码


import matplotlib.pyplot as plt
import numpy as np


# 贝塞尔曲线
def Bezier(t, points):
    n = len(points) - 1  # n可以取到
    res = 0
    c = 1  # 基函数结果
    for i in range(n+1):  # n可以取到
        if i > 0:
            c = c * (n - i + 1) / i  # 更新贝塞尔基函数的结果系数
        _1_t = (1-t)**i  # (1-t)^i
        _t = t**(n-i)  # t^(n-i)
        res += c * _1_t * _t * points[i]
    return res
 

def show(x, y, xs, ys, ax, plot_c='g',plot_c_2='b', scater_c='r'):
    ax.plot(x, y, c=plot_c)
    ax.scatter(x,y,color='r',marker='o', linewidths=4)
    ax.scatter(x,y,color='w',marker='o', linewidths=1) 
    ax.plot(xs, ys, c=plot_c_2)
    for i in range(len(x)):
        ax.annotate(f'{x[i]}, {y[i]}', (x[i]+0.2, y[i]-0.2))


def runBezier(x, y, n=100):
    xs = []
    ys = []
    
    for u in np.linspace(0, 1, num=n):
        xs.append(Bezier(u, points=x))
        ys.append(Bezier(u, points=y))
    return xs, ys
 

if __name__ == '__main__':
    x = [0, 3, 4, 10, 5, 6]
    y = [0, 6, 10, 0, 5, 3]
    
    nodeVector = [0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1] 
    fig, axs = plt.subplots(2, 2)

    xs, ys = runBezier(x, y)
    show(x, y, xs, ys, axs[0, 0])
    axs[0, 0].set_title('Bezier') 

    plt.tight_layout()
    plt.show()

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值