个人博客:https://www.vectormoon.net/
Bezier曲线算法:https://www.vectormoon.net/2020/09/25/Bezier/

算法产生背景

Bezier曲线有以下几个不足点,所以导致出现了B-spline算法:

  • 一旦确定特征多边形,就确定了曲线的阶次
  • Bezier曲线拼接复杂(需要满足几何连续性,参数连续性等)
  • Bezier曲线不能作局部修改(只能整体修改)

B-spline算法是整条曲线用一段一段的曲线连接而成,采用分段连续多段式生成

B-spline曲线定义

B-spline曲线定义为:

P ( u ) = ∑ i = 0 n P i B i , k ( u ) u ∈ [ u k − 1 , u n + 1 ] P(u)=\sum_{i=0}^nP_iB_{i,k}(u) \qquad u\in [u_{k-1}, u_{n+1}] P(u)=i=0∑n​Pi​Bi,k​(u)u∈[uk−1​,un+1​]

其中 P i P_i Pi​是特征多边形的顶点; B i , k B_{i,k} Bi,k​称为k阶(k-1次)基函数,B-spline算法阶数是次数加1,这是和Bezier算法的一个不同之处;定义域的解释之后会给出,先给出基函数算法。

B-spline基函数的求出算法应用最广泛的是deBoor-cox递推算法:

B i , k ( u ) = u − u i u i + k − 1 − u i ∗ B i , k − 1 u + u i + k − u u i + k − u i + 1 ∗ B i + 1 , k + 1 ( u ) B_{i,k}(u)=\frac{u-u_i}{u_{i+k-1}-u_i}*B_{i,k-1}{u}+\frac{u_{i+k}-u}{u_{i+k}-u_{i+1}}*B_{i+1,k+1}(u) Bi,k​(u)=ui+k−1​−ui​u−ui​​∗Bi,k−1​u+ui+k​−ui+1​ui+k​−u​∗Bi+1,k+1​(u)

B i , 1 ( u ) = { 1 u i < u < u i + 1 ; 0 O t h e r w i s e . B_{i,1}(u)=\begin{cases}1 & u_i<u<u_{i+1};\\0 & Otherwise.\end{cases} Bi,1​(u)={10​ui​<u<ui+1​;Otherwise.​

规定0/0=0

B-spline曲线的定义域为 u ∈ [ u k − 1 , u n + 1 ] u\in [u_{k-1}, u_{n+1}] u∈[uk−1​,un+1​]。设U为所有节点矢量的集合,显见节点表个数为 n + k + 1 n+k+1 n+k+1个。举例说明,当 n = 4 , k = 4 n=4,k=4 n=4,k=4时,有 U = { u 0 , u 1 , u 2 , u 3 , u 4 , u 5 , u 6 , u 7 , u 8 } U=\{u_0,u_1,u_2,u_3,u_4,u_5,u_6,u_7,u_8\} U={u0​,u1​,u2​,u3​,u4​,u5​,u6​,u7​,u8​}。第一项为 P 0 B 0 , 4 ( u ) P_0B_{0,4}(u) P0​B0,4​(u),由deBoor-cox算法可知,其涉及到 u 0 u_0 u0​到 u 4 u_4 u4​五个点;第二项同理,设计到 u 1 u_1 u1​到 u 5 u_5 u5​五个点;其余同理;所以可以画出区间对应坐标轴:

区间合法所需要的条件为:区间内必须有足够基函数与顶点对应,也即区间中基函数覆盖较多的区间才是一个合法区间。所以上例中对应的合法区间为 u ∈ [ u 3 , u 5 ] u\in [u_{3}, u_{5}] u∈[u3​,u5​]也就是 u ∈ [ u k − 1 , u n + 1 ] u\in [u_{k-1}, u_{n+1}] u∈[uk−1​,un+1​]

B-spline的类型划分

有均匀B样条曲线,准均匀B样条曲线,分段Bezier曲线,非均匀B样条曲线这几种方法,这里采用均匀B样条曲线的方法绘制曲线。

均匀B样条曲线

定义:当节点沿参数轴均匀等距分布,即 u i + 1 − u i = C > 0 u_{i+1}-u_i=C>0 ui+1​−ui​=C>0时,为均匀B样条函数,比如: { 0 , 1 , 2 , 3 , 4 , 5 , 6 } , { 0 , 0.2 , 0.4 , 0.6 , 0.8 , 1 } \{0,1,2,3,4,5,6\},\{0,0.2,0.4,0.6,0.8,1\} {0,1,2,3,4,5,6},{0,0.2,0.4,0.6,0.8,1}

B-spline基函数( B i , k B_{i,k} Bi,k​)的递推公式计算需要用到这里的思想。这里还使用上面当 n = 4 , k = 4 n=4,k=4 n=4,k=4的例子,从上面的定义可知,我们可以把节点集合 U = { u 0 , u 1 , u 2 , u 3 , u 4 , u 5 , u 6 , u 7 , u 8 } U=\{u_0,u_1,u_2,u_3,u_4,u_5,u_6,u_7,u_8\} U={u0​,u1​,u2​,u3​,u4​,u5​,u6​,u7​,u8​}写成这样 U = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } U=\{0,1,2,3,4,5,6,7,8\} U={0,1,2,3,4,5,6,7,8}也即 u 0 = 0 , u 1 = 1 , . . . , u 8 = 8 u_0=0,u_1=1,...,u_8=8 u0​=0,u1​=1,...,u8​=8,当然U也可以写成其他集合,因为计算的时候是一个比例,所以对计算结果并没有影响,综上就可以简单的算出对应基函数的值。

代码实现

def B_spline(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绘制三次(四阶)均匀B样条曲线"""result = []n = len(p_list)k = 4u = k-1while (u < n+1):x, y = 0, 0#calc P(u)for i in range(0, n):B_ik = deBoor_Cox(u, k, i)x += B_ik * p_list[i][0]y += B_ik * p_list[i][1]result.append((int(x+0.5), int(y+0.5)))u += 1/20927 #2020/09/27return resultdef deBoor_Cox(u, k, i):if k==1:if i <= u and u <= i+1:return 1else:return 0else:coef_1, coef_2 = 0, 0if (u-i == 0) and (i+k-1-i == 0):coef_1 = 0else:coef_1 = (u-i) / (i+k-1-i)if (i+k-u == 0) and (i+k-i-1 == 0)coef_2 = 0else:coef_2 = (i+k-u) / (i+k-i-1)return coef_1 * deBoor_Cox(u, k-1, i) + coef_2 * deBoox_Cox(u, k-1, i+1)

B-spline算法(B样条曲线)相关推荐

  1. Spline算法实现

    0 前言 本文总结不同工具对Spline算法的实现情况. 1 Matlab 1.1 spline() 具体案例详见<Spline导数及曲率计算>.<函数逼近方法>第1.3小节. ...

  2. 样条曲线_Apollo规划算法基于样条曲线的平滑分析(一)

    欢迎关注微信公众号<不想做科学家的工程师不是好码农> 样条曲线的思想是把一个长线分成N段,每段用一个多项式去表示,本文为了简化公式书写,示例中均使用三次多项式表示,实际算法中阶数根据需求不 ...

  3. 百度Apollo自动驾驶专题讲座笔记之运动规划模块

    在百度技术学院有Apollo的技术专题课程,对各个模块都有一个入门级的课程,对于了解各个模块间的相互作用关系有很大的作用,很适合对自动驾驶领域感兴趣的人的入门课程.感谢百度Apollo开放了这么好的课 ...

  4. ardupilot-3.6.10——航点导航WPNav之样条曲线(Spline Navigation)

    参考:慕离巷的<ArduCopter--ArduPilot--航点导航WPNav(二)--Spline Navigation>.三石の四夕的<三次Hermite插值>.zhan ...

  5. 图片拼接镶嵌算法(image spline and mosaics经典算法)实现过程和效果展示

    图片拼接镶嵌算法(image spline and mosaics经典算法)实现过程和效果展示 2010-01-01 14:56 图片拼接镶嵌(image spline and mosaics)应用很 ...

  6. 自动驾驶规划控制(A*、pure pursuit、LQR算法,使用c++在ubuntu和ros环境下实现)

    文章目录 1 目录概述 2 算法介绍 2.1 Astart改进 2.2 ROS(Gazebo仿真) 2.2.1 使用Gazebo仿真需要安装的功能包 2.2.2 创建工作空间 catkin_ws 2. ...

  7. 图像拼接--A multiresolution spline with application to image mosaics

    A multiresolution spline with application to image mosaics <Acm Trans on Graphics> , 1983 , 2 ...

  8. python 非线性规划_自动驾驶运动规划-Hybird A*算法(续)

    Hybird A*算法保证生成的路径是车辆可实际行驶的,但它仍然包含很多不必要的车辆转向操作,我们可以对其进行进一步的平滑和优化. Objective Function 对于Hybird A*生成的车 ...

  9. cad多段线画圆弧方向_(cad多段线画圆弧方向)在cad中如何使用excel画样条曲线

    在cad中如何使用excel画样条曲线 AutoCAD本身没有提供函数曲线的绘制功能,不能直接利AutoCAD绘制函数曲线,但借助其他工具也能绘制,常用的方法有3种,第一种,借助其他能绘制函数曲线的C ...

最新文章

  1. 分布式定时任务xxl-job的常用姿势都集齐了,So Easy!
  2. Biztalk 2006 adapter的开发比2004容易的多
  3. bat批处理延迟运行脚本
  4. 表格隔行变色_CSS实现鼠标悬停高亮
  5. Apache Shiro 简介
  6. Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决
  7. monkeyrunner脚本的录制和回放
  8. 【agc004d】Teleporter
  9. 【转】简洁帮助文档制作 EasyCHM V3.84 build545 下载(含破解及注册码)
  10. Win7 FTP搭建
  11. 访问网络计算机提示0 80070035,win7访问局域网共享文件出现 0x80070035错误的解决办法...
  12. ssm基于微信小程序校园商铺购物商城系统
  13. cypress 安装
  14. 张亚勤功成身退,人生继续硬核
  15. 分布式环境搭建之Redis安装及使用
  16. 解决笔记本windows11充电后,屏幕亮度忽明忽暗的问题
  17. 制作MMORPG游戏需要储备哪些门子技术
  18. java三元表达式嵌套_三元运算符的嵌套详解:分别在JSTL、JavaScript和Java中
  19. 短视频APP相关推荐资源位的高扩展高可用工程实践
  20. cloudreve使用体验

热门文章

  1. C语言——测试电脑大小端
  2. Windows10搭建turn服务器
  3. 通过AD域验证登录Linux系统(Linux安装sssd加入Windows AD域)
  4. whale 帷幄:crm客户管理营销系统全称是什么
  5. Javafx中切换输入法
  6. 【金猿技术展】视频矫正技术——基于参数估计的自由几何变换算法
  7. 如何把公司网址生成二维码
  8. element audio 标签 不显示_不闪屏,HDR,带鱼屏全都有,LG 29WK600宽屏显示器测评...
  9. qemu-system-x86_64: warning: host doesn‘t support requested feature: CPUID.80000001H:ECX.svm [bit 2]
  10. 我的世界电脑正版服务器地址大全,《我的世界》服务器地址大全 各个服务器一览分享...