上一讲讲解了伯恩斯坦多项式,现在就开始对Bezier曲线进行研究。Bezier曲线采用伯恩斯坦多项式作为基函数。

首先,我们定义Bezier曲线的表达式:
C(t)=∑k=0nPkBkn(t)(1)\begin{aligned} \mathcal{C}(t) = \sum_{k=0}^n \mathbf{P}_k B_k^n(t) \end{aligned} \tag{1} C(t)=k=0∑n​Pk​Bkn​(t)​(1)

其中,(P)0≤k≤n\left( \mathbf{P} \right)_{0 \le k \le n}(P)0≤k≤n​是Bezier的控制顶点。虽然该表达式看起来很简单,但还是不那么直观,下面我们使用代码实现一下Bezier曲线。

计算伯恩斯坦多项式的值

要绘制出Bezier曲线,首先需要先求出nnn次伯恩斯坦多项式在ttt处的值,这里我们使用伯恩斯坦多项式的递归定义
Bk,n(t)=(1−t)Bk,n−1(t)+tBk−1,n−1(t)B_{k,n}(t)=(1-t)B_{k,n-1}(t)+tB_{k-1,n-1}(t) Bk,n​(t)=(1−t)Bk,n−1​(t)+tBk−1,n−1​(t)
代码实现如下

def all_bernstein(n, t):b = np.zeros(n+1)b[0] = 1.t1 = 1.-tfor j in range(1, n+1):saved = 0.for i in range(0, j):tmp = b[i]b[i] = saved + t1*tmpsaved = t*tmpb[j] = savedreturn b

计算Bezier曲线的值

我们根据式(1),可以直接求得Bezier曲线在某一点处的值。伯恩斯坦多项式的次数根据控制顶点P\mathbf{P}P的个数确定。

def point_on_bezier_curve(P,t):n = len(P) - 1b = all_bernstein(n, t)c = 0.for k in range(0, n+1):c += b[k]*P[k]return c

一些例子

下面例子中的ts表示在参数域的采样点

def example_1():    nt = 200ts = np.linspace(0., 1., nt)P = np.zeros((2, 2))P[:, 0] = [0., 1.]P[:, 1] = [1., 0.]Q = np.zeros((nt, 2))for i,t in enumerate(ts):Q[i,:] = point_on_bezier_curve(P,t)plt.plot(Q[:,0], Q[:,1], '-b')plt.plot(P[:,0], P[:,1], '--ok', linewidth=0.7)for i in range(0, 2):x,y = P[i,:]plt.text(x+0.05,y+0.05,'$\mathbf{P}_{' + str(i) + '}$')plt.axis([-0.2, 1.2, -0.2, 1.2])#ax = plt.axes()#ax.set_aspect('equal', 'box')example_1()

def example_3a():    nt = 200ts = np.linspace(0., 1., nt)P = np.zeros((4, 2))P[:, 0] = [1., 1., 0., -1.]P[:, 1] = [0., 1., 1.,  0.]Q = np.zeros((nt, 2))for i,t in enumerate(ts):Q[i,:] = point_on_bezier_curve(P,t)plt.plot(Q[:,0], Q[:,1], '-b')plt.plot(P[:,0], P[:,1], '--ok', linewidth=0.7)for i in range(0, 3):x,y = P[i,:]plt.text(x+0.05,y+0.05,'$\mathbf{P}_{' + str(i) + '}$')i = 3x,y = P[i,:]plt.text(x-0.05,y+0.05,'$\mathbf{P}_{' + str(i) + '}$')plt.axis([-1.2, 1.2, -0.2, 1.2])#ax = plt.axes()#ax.set_aspect('equal', 'box')example_3a()

复合Bezier曲线

def plot_composite_bezier_curve():n = 2nt = 200ts = np.linspace(0., 1., nt)# ...P = np.zeros((3, 2))P[:, 0] = [1., 1., 0.]P[:, 1] = [0., 1., 1.]Q = np.zeros((nt, 2))for i,t in enumerate(ts):Q[i,:] = point_on_bezier_curve(P,t)plt.plot(Q[:,0], Q[:,1], '-r')plt.plot(P[:,0], P[:,1], '--or', linewidth=0.7)# ...# ...P = np.zeros((3, 2))P[:, 0] = [0., -1., 0.]P[:, 1] = [1., -1., -1.]Q = np.zeros((nt, 2))for i,t in enumerate(ts):Q[i,:] = point_on_bezier_curve(P,t)plt.plot(Q[:,0], Q[:,1], '-b')plt.plot(P[:,0], P[:,1], '--ob', linewidth=0.7)# ...# ...P = np.zeros((3, 2))P[:, 0] = [1., 1., 0.]P[:, 1] = [0., -1., -1.]Q = np.zeros((nt, 2))for i,t in enumerate(ts):Q[i,:] = point_on_bezier_curve(P,t)plt.plot(Q[:,0], Q[:,1], '-g')plt.plot(P[:,0], P[:,1], '--og', linewidth=0.7)# ...#plt.axis('equal')#plt.title('Composite Bézier curve')plot_composite_bezier_curve()

一些Beizer曲线的性质

  • 伯恩斯坦基函数次数=控制顶点数-1
  • 控制顶点数=伯恩斯坦基函数的个数
  • 伯恩斯坦基函数的个数=伯恩斯坦基函数次数+1
  • 物理域的取值只和控制顶点的取值有关

Bezier曲线(附Python实现代码)相关推荐

  1. 【机器学习入门】(13) 实战:心脏病预测,补充: ROC曲线、精确率--召回率曲线,附python完整代码和数据集

    各位同学好,经过前几章python机器学习的探索,想必大家对各种预测方法也有了一定的认识.今天我们来进行一次实战,心脏病病例预测,本文对一些基础方法就不进行详细解释,有疑问的同学可以看我前几篇机器学习 ...

  2. 【机器视觉案例】(5) AI视觉,手势调节物体尺寸,附python完整代码

    各位同学好,今天和大家分享一下如何使用opencv+mediapipe完成远程手势调节图片尺寸的案例.先放张图看效果.当拇指和食指竖起时,根据食指间的连线的长度自由缩放图片尺寸.图片的中点始终位于指尖 ...

  3. 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe+Opencv完成虚拟计算器,先放张图看效果.FPS值为29,食指和中指距离小于规定阈值则认为点击按键,为避免重复数字出现,规定每20帧可点击一 ...

  4. 【MediaPipe】(4) AI视觉,远程手势调节电脑音量,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe完成手势调节电脑音量,先放张图看效果. 注意!! 本节需要用到手部关键点的实时跟踪,我已经在之前的文章中详细写过了,本节会直接使用,有疑问的同学 ...

  5. 【深度学习】(2) 数据加载,前向传播2,附python完整代码

    生成数据集: tf.data.Dataset.from_tensor_slices(tensor变量) 创建一个数据集,其元素是给定张量的切片 生成迭代器: next(iter()) next() 返 ...

  6. 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集

    各位同学好,今天我和大家分享一下python机器学习中线性回归算法的实例应用,并介绍正则化.岭回归方法.在上一篇文章中我介绍了线性回归算法的原理及推导过程:[机器学习](7) 线性回归算法:原理.公式 ...

  7. 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集

    各位同学好,今天和大家分享一下python机器学习中的决策树算法,在上一节中我介绍了决策树算法的基本原理,这一节,我将通过实例应用带大家进一步认识这个算法.文末有完整代码和数据集,需要的自取.那我们开 ...

  8. 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集

    各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...

  9. word2vec模型原理(附python实现代码)

    附python实现代码 模型训练 import logging import gensim from gensim.models import word2vec # 设置输出日志 logging.ba ...

  10. 前景背景样本不均衡解决方案:Focal Loss,GHM与PISA(附python实现代码)

    参考文献:Imbalance Problems in Object Detection: A Review 1 定义 在前景-背景类别不平衡中,背景占有很大比例,而前景的比例过小,这类问题是不可避免的 ...

最新文章

  1. svn官方备份hot-backup.py强烈推荐
  2. Oracle的SQL语句
  3. 1微秒等于多少皮秒_注册汽油贸易公司分享1升汽油等于多少公斤?
  4. python各种文件数据的读取
  5. Apache MINA 2.0 用户指南
  6. 移植uboot第十步:制作uboot补丁
  7. vb 字符串替换_学习VB编程第69天 字符串查找与替换
  8. python 如何取负数?直接加负号( - )
  9. 2进程之间的关系:进程组,会话,守护进程
  10. C# error CS1729: 'XXClass' does not contain a constructor that takes 0 arguments的解决方案
  11. POJ1741 Tree(点分治)
  12. shell :将标准输出及标准错误输出写到指定文件
  13. 重构Webpack系列之二 ---- 入口起点
  14. fortran 教程
  15. 视频综合平台系统架构分析-1
  16. 刷IP工具、刷IP软件的原理和工作过程
  17. DICOM世界观·第二章:[2]像素操作
  18. 参考文献中英文人名_英文人名的缩写和参考文献写法
  19. 关于部分积分,动能公式另一种推导
  20. Feed Ratios

热门文章

  1. 为什么AQS使用双向链表
  2. Slam(即时定位与地图构建) 知识篇
  3. nmf算法 python_python-非负矩阵分解-NMF
  4. 成年人必看的六个故事教你学会做人!
  5. 你确定会用Numpy的argmax()吗?
  6. 大数据之MapReduce并行算法简单概括
  7. webbuilder安装记录
  8. 生物特征识别之指纹识别,伪造,指纹设备缺陷设计
  9. c语言10个评委给n个选手打分,在歌星大奖赛中,有10个评委为参赛选手打分,分数为1到100分。...
  10. Java学习笔记day7——枚举类练习、包装类、抽象类、接口