贝塞尔曲线的python实现(简单易理解)

简介

贝塞尔曲线在计算机图形学中被大量使用,通常可以产生平滑的曲线。比如ps中的钢笔工具,就是利用的这种原理。由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大的差别。即使是一位精明的画师能轻松绘出各种图形,拿到鼠标想随心所欲的画图也不是一件容易的事。这一点是计算机万万不能代替手工的工作,所以人们只能颇感无奈。使用贝塞尔工具画图很大程度上弥补了这一缺憾。贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。通过在二维平面上放置几个锚点,根据锚点的路径和描绘的先后顺序,产生直线或者是光滑曲线的效果。

一阶曲线

B 1 ( t ) = P 0 + ( P 1 − P 0 ) t B_1(t)=P_0+(P_1-P_0)t B1(t)=P0+(P1P0)t B 1 ( t ) = ( 1 − t ) P 0 + t P 1 , t ∈ [ 0 , 1 ] B_1(t)=(1-t)P_0+tP_1,t\in [0,1] B1(t)=(1t)P0+tP1,t[0,1]

一阶曲线就是很好理解, 就是根据t来的线性插值. P0表示的是一个向量 [x ,y], 其中x和y是分别按照这个公式来计算的。

import matplotlib.pyplot as plt
import numpy as np

points = np.array([[1,2],[2,1]])# 在此处修改坐标
t = np.linspace(0,1,1000)
t = np.array([t,t]).T
B1 = (1-t)*points[0]+t*points[1]

plt.plot(B1[:,0],B1[:,1])
plt.plot(points[:,0],points[:,1],'r.')
plt.show()

请添加图片描述

n阶曲线

B i , n ( t ) = C n i t i ( 1 − t ) n − i = n ! i ! ( n − i ) ! t i ( 1 − t ) n − i ,    i = 0 , 1 , ⋯   , n B_{i,n}(t)=C_n^it^i(1-t)^{n-i}=\frac{n!}{i!(n-i)!}t^i(1-t)^{n-i},\; i=0,1,\cdots,n Bi,n(t)=Cniti(1t)ni=i!(ni)!n!ti(1t)ni,i=0,1,,n P ( t ) = ∑ i = 0 n P i B i , n ( t , t ∈ [ 0 , 1 ] ) P(t)=\sum_{i=0}^nP_iB_{i,n}(t,t\in [0,1]) P(t)=i=0nPiBi,n(t,t[0,1])

实现方法1(numpy版本)

import matplotlib.pyplot as plt
import numpy as np

def getB(i):
    t = np.math.factorial(n)*init_t**i*(1-init_t)**(n-i)/(np.math.factorial(i)*np.math.factorial(n-i))
    return np.array([t,t]).T

points = np.array([[1,3],[7,9],[1,6]])# 在此处修改坐标
n = points.shape[0]-1
init_t = np.linspace(0,1,1000)
P = np.zeros((1000,2))
for i in range(n+1):
    P += getB(i)*points[i]

plt.plot(P[:,0],P[:,1])
plt.plot(points[:,0],points[:,1],'r.')
plt.show()

请添加图片描述

实现方法2(易读版本)

from math import factorial
import matplotlib.pyplot as plt

points = [[0,0],[-1,3],[4,3],[6,0],[7,2.5]]# 在此处修改坐标
N = len(points)
n = N - 1 
px = []
py = []
for T in range(1001):
    t = T*0.001
    x,y = 0,0
    for i in range(N):
        B = factorial(n)*t**i*(1-t)**(n-i)/(factorial(i)*factorial(n-i))
        x += points[i][0]*B
        y += points[i][1]*B
    px.append(x)
    py.append(y)

plt.plot(px,py)
plt.plot([i[0] for i in points],[i[1] for i in points],'r.')
plt.show()

请添加图片描述

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贝塞尔曲线是一种通过插值方法生成的曲线,它用于在给定一组控制点的情况下绘制平滑曲线。在Python中,有多种实现贝塞尔曲线的方法。 方法1是使用numpy库来实现贝塞尔曲线。首先,通过numpy的array函数创建一个包含控制点的数组。然后,根据控制点的数量,使用循环来计算每个点的贝塞尔基函数。最后,将计算得到的点绘制出来。这种方法使用了numpy的向量化操作,可以更加高效地计算贝塞尔曲线。 方法2是使用math库的factorial函数来实现贝塞尔曲线。与方法1不同的是,这里使用了逐点计算的方式来生成贝塞尔曲线。通过遍历一定范围内的参数t的值,计算每个t对应的贝塞尔基函数值,并根据控制点的位置加权求和,得到曲线上的点。最后将计算得到的点绘制出来。 贝塞尔曲线的数学表示可以使用二项式系数和贝塞尔基函数来定义。其中,二项式系数用于计算贝塞尔基函数的权重,贝塞尔基函数则根据参数t和控制点的位置计算每个点的权重。贝塞尔曲线是通过对所有基函数进行加权求和得到的。 综上所述,Python中可以使用numpy库或者math库来实现贝塞尔曲线。方法1使用了numpy的向量化操作来提高计算效率,方法2则是逐点计算曲线上的点。您可以根据自己的需求选择适合的方法来实现贝塞尔曲线。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [贝塞尔曲线python实现简单理解)](https://blog.csdn.net/meng_xin_true/article/details/123924154)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值