Bezier曲线(附Python实现代码)
上一讲讲解了伯恩斯坦多项式,现在就开始对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∑nPkBkn(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实现代码)相关推荐
- 【机器学习入门】(13) 实战:心脏病预测,补充: ROC曲线、精确率--召回率曲线,附python完整代码和数据集
各位同学好,经过前几章python机器学习的探索,想必大家对各种预测方法也有了一定的认识.今天我们来进行一次实战,心脏病病例预测,本文对一些基础方法就不进行详细解释,有疑问的同学可以看我前几篇机器学习 ...
- 【机器视觉案例】(5) AI视觉,手势调节物体尺寸,附python完整代码
各位同学好,今天和大家分享一下如何使用opencv+mediapipe完成远程手势调节图片尺寸的案例.先放张图看效果.当拇指和食指竖起时,根据食指间的连线的长度自由缩放图片尺寸.图片的中点始终位于指尖 ...
- 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码
各位同学好,今天和大家分享一下如何使用MediaPipe+Opencv完成虚拟计算器,先放张图看效果.FPS值为29,食指和中指距离小于规定阈值则认为点击按键,为避免重复数字出现,规定每20帧可点击一 ...
- 【MediaPipe】(4) AI视觉,远程手势调节电脑音量,附python完整代码
各位同学好,今天和大家分享一下如何使用MediaPipe完成手势调节电脑音量,先放张图看效果. 注意!! 本节需要用到手部关键点的实时跟踪,我已经在之前的文章中详细写过了,本节会直接使用,有疑问的同学 ...
- 【深度学习】(2) 数据加载,前向传播2,附python完整代码
生成数据集: tf.data.Dataset.from_tensor_slices(tensor变量) 创建一个数据集,其元素是给定张量的切片 生成迭代器: next(iter()) next() 返 ...
- 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集
各位同学好,今天我和大家分享一下python机器学习中线性回归算法的实例应用,并介绍正则化.岭回归方法.在上一篇文章中我介绍了线性回归算法的原理及推导过程:[机器学习](7) 线性回归算法:原理.公式 ...
- 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集
各位同学好,今天和大家分享一下python机器学习中的决策树算法,在上一节中我介绍了决策树算法的基本原理,这一节,我将通过实例应用带大家进一步认识这个算法.文末有完整代码和数据集,需要的自取.那我们开 ...
- 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集
各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...
- word2vec模型原理(附python实现代码)
附python实现代码 模型训练 import logging import gensim from gensim.models import word2vec # 设置输出日志 logging.ba ...
- 前景背景样本不均衡解决方案:Focal Loss,GHM与PISA(附python实现代码)
参考文献:Imbalance Problems in Object Detection: A Review 1 定义 在前景-背景类别不平衡中,背景占有很大比例,而前景的比例过小,这类问题是不可避免的 ...
最新文章
- svn官方备份hot-backup.py强烈推荐
- Oracle的SQL语句
- 1微秒等于多少皮秒_注册汽油贸易公司分享1升汽油等于多少公斤?
- python各种文件数据的读取
- Apache MINA 2.0 用户指南
- 移植uboot第十步:制作uboot补丁
- vb 字符串替换_学习VB编程第69天 字符串查找与替换
- python 如何取负数?直接加负号( - )
- 2进程之间的关系:进程组,会话,守护进程
- C# error CS1729: 'XXClass' does not contain a constructor that takes 0 arguments的解决方案
- POJ1741 Tree(点分治)
- shell :将标准输出及标准错误输出写到指定文件
- 重构Webpack系列之二 ---- 入口起点
- fortran 教程
- 视频综合平台系统架构分析-1
- 刷IP工具、刷IP软件的原理和工作过程
- DICOM世界观·第二章:[2]像素操作
- 参考文献中英文人名_英文人名的缩写和参考文献写法
- 关于部分积分,动能公式另一种推导
- Feed Ratios
热门文章
- 为什么AQS使用双向链表
- Slam(即时定位与地图构建) 知识篇
- nmf算法 python_python-非负矩阵分解-NMF
- 成年人必看的六个故事教你学会做人!
- 你确定会用Numpy的argmax()吗?
- 大数据之MapReduce并行算法简单概括
- webbuilder安装记录
- 生物特征识别之指纹识别,伪造,指纹设备缺陷设计
- c语言10个评委给n个选手打分,在歌星大奖赛中,有10个评委为参赛选手打分,分数为1到100分。...
- Java学习笔记day7——枚举类练习、包装类、抽象类、接口