个人博客:

vectormoon's blog​www.vectormoon.net

bezier算法的背景

vm公司设计出了一个原型车——moon,这样的:

产品经理一看觉得有点抽象,他使用了Bezier算法改进了一下原型车,变成了这样(红线部分):

Bezier算法在做的事,通过光滑的曲线逼近用户给出的折线段(准确的来说是给出的**控制顶点**,即图中蓝色的点。这些点连线构成的多边形又叫**特征多边形**)


Bezier曲线的定义

Bezier算法围绕着Bezier曲线展开,Bezier曲线的定义为:

其中P(i)为控制顶点,n表示有n+1个控制顶点,

为Bernstein基函数;其中

肯定有人会和笔者一样,疑惑为什么会突然出现一个Bernstein函数,大致的原因是这样:提出算法的Bezier当时给出了一个较为复杂的Bezier曲线函数,在提出若干年后施法中教授[^1]给出了证明过程,可见原式的复杂性;而后Forrest在后来证明出原基函数可以简化成Bernstein基函数。


参数t的重要性

当上式t从0取到1就是对应的Bezier曲线图像。$t$从0选取到1才能绘制出整个图像,不失一般性,当绘制一个二次Bezier曲线时,$n=2$,有三个控制顶点,若每个控制顶点对应的$t=0$,显见必定只能得到一个点,**所以t的选取也至关重要**,举个例子:

1. 三个控制顶点分别为(0,0),(200,100),(400,0);则图像如下:

取t分别为

非常合理

2. 但若三个控制点分别取(0,0),(300,50),(400,0)时,则图像如下:

显然此时仍然取

有些许欠妥

所以t的取值也是重中之重,只有t的值选取的好才能让曲线更加贴合


t的选取

t的选取有这几种方法:均匀参数化、累加弦长参数化,向心参数化法;这里只介绍第一种均匀参数化方法。笔者后面展示的代码也是选用了这种方法。

均匀参数化:节点在参数轴均匀分布,比如:


Bezier生成曲线算法

Bezier生成曲线算法有两种:其中一种就是用上面提到的方法直接生成曲线,不过其中涉及到大量组合数的计算,较为耗时;另外一种算法是de Casteljau递推算法生成曲线,递推式为:

举例:不失一般性,假设绘制二次Bezier曲线,当

时,设有
三个点,在线段
三分之一处画出
;在线段
三分之一处画出
;连接两点
,在线段
三分之一处画出
过程如下:

显见递推式的几何意义为:

下面是具体绘制过程:

一次Bezier曲线:

二次Bezier曲线:

三次Bezier曲线:


代码实现

def draw_curve(p_list):""":param p_list: (list of list of int:[[x0, y0], [x1, y1], ...])point set of presult: (list of list of int:[[x0, y0], [x1, y1], ...])point on curve"""result = []P = []P = p_list.copy()r = len(p_list)for i in range(0, 20923): #2020/09/23t = i/20923x, y = de_Casteljau(r, P, t)result.append((x, y))return resultdef de_Casteljau(n, pointSet_p, t):""":param n: number of control:param pointSet_p: (list of list of int:[[x0, y0], [x1, y1], ...])point set of p:param t: t"""while(n):for i in range(0, n-1):P[i][0] = (1-t)*P[i][0] + t*P[i+1][0]P[i][1] = (1-t)*P[i][1] + t*P[i+1][1]n -= 1P[0][0] = int(P[0][0] + 0.5)P[0][1] = int(P[0][1] + 0.5)return P[0]

[^1]:施法中.Bézier基函数的导出[J].航空学报,1980,第1期:P92-98

bezier曲线_Bezier算法相关推荐

  1. Bezier曲线的拼接

    Bezier曲线的拼接 根据前面对Bezier曲线生成算法的介绍,显然随着点的增加,接着会引起  的次数提高,而而高次多项式又会带来计算上的困难. 对于上式子,也就是随着n的增加,t的次数也会随着增加 ...

  2. matlab 贝塞尔曲线,基于MATLAB动态实现Bezier曲线几何作图.pdf

    基于MATLAB动态实现Bezier曲线几何作图.pdf 2015年 1月 黑龙江生态工程职业学院学报 Jan.2O15 第28卷第 1期 JournalofHeilongjiangVocationa ...

  3. 实验10 Bezier曲线生成

    1.实验目的: 了解曲线的生成原理: 掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2.实验内容: (1)结合示范代码了解曲线生成原理与算法实现,尤其是Bezier ...

  4. Bezier曲线的生成算法

    Bezier曲线的生成方法 生成一条Bezier曲线实际上就是要求出曲线上的点. 1.根据定义直接生成Bezier曲线 定义: 其中 那么生成步骤为: ①首先给出  的递归计算式: ②:将表示成分量形 ...

  5. 德卡斯特里奥算法——找到Bezier曲线上的一个点

    http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html 随着Bezier曲线的构造,接下来最 ...

  6. 计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)

    一.实现方案 贝塞尔曲线原理:贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一.它通过控制曲线上的四个点(起始点.终止点以及两个相互分离的中间点)来创造.编辑图形.其中起重 ...

  7. 曲线数学NURBS之bezier曲线

    最近新研究topic是NURBS,NURBS(Non Uniform Rational B-spline)即非均匀有理B样条曲线.往往提到B样条.以及NURBS就会提到bezier曲线,他们之间的关系 ...

  8. 计算机图形学Bezier曲线试题,《计算机图形学》试题-C卷及参考答案

    计算机图形学试题 C 一.选择题(20分) 1.计算机图形显示器一般使用什么颜色模型?(A ) A. RGB B. CMY C. HSV D. HLS 2.分辨率为1024×1024的显示器各需要多少 ...

  9. 开源项目推荐:Bezier曲线、B-Spline和NURBS的区别与《THE NURBS BOOK 2nd》简介,曲线拟合可视化工具

    一.基本概念 B-Spline:B样条曲线 NURBS(Non Uniform Rational B-Spline):非均匀有理B样条曲线 B样条曲线有三种类型: 当起始点和终止点的重复度为最高次数加 ...

最新文章

  1. AI吉尼斯:那些你不知道的人工智能之“最”
  2. python编程标准_python编程规范
  3. idea 这么还原debug_看源码,我为什么推荐IDEA ?
  4. c语言ad采样程序思路,单片机AD采样程序及其寄存器讲解
  5. DCMTK:Telnet发起程序(ti)主程序
  6. 【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?(转)
  7. 编写java程序的三步骤_帮助Java小白涨知识的教程(三)(运行HelloWorld程序)
  8. Git GitHub Gitee GitLab
  9. aix系统输入oracle命令,aix 简单的系统命令
  10. 陌陌 3 千万数据暗网出售;美团反腐 89 人受刑事查处;iPhone 推迟 5G 采用时间 | 极客头条...
  11. SOFABolt 源码分析
  12. UAV 无人机检测实践分析
  13. 如何用Python脚本从文件读取数据?
  14. STAMP可以用在win10上面吗
  15. Vue 使用 Apache Echarts 绘制地图(省市、地区)
  16. 【题解】[LuoguP3503]「BZOJ2086」[POI2010] Blocks
  17. iftop监控网络流量命令详解
  18. Python批量复制文件夹及其内容、并按Excel表格遍历重命名文件夹
  19. Python 博客园快速备份脚本
  20. P1926 小书童——刷题大军 题解

热门文章

  1. OSI中端到端与点到点区别。
  2. 【学习干货】目标检测算法之SSD
  3. 面向高精度领域的视觉伺服算法汇总
  4. 目标检测中的特征冲突与不对齐问题
  5. 世界机器人领域12个前沿技术趋势
  6. Django详解之models操作
  7. 《设计模式 系列》- 面向对象六大原则
  8. 20155328 《信息安全系统设计基础》第六周 课堂提交补充
  9. MySQL配置文件mysql.ini参数详解
  10. 如何修改WINDOWS默认的3389远程端口