轨迹规划——Bezier曲线与B样条曲线

轨迹规划——Bezier曲线与B样条曲线一、Bezier曲线1、Bezier曲线的背景给定n+1个数据点,p0~pn,生成一条曲线,使得该曲线与这些点描述的形状相符。(如果要求曲线通过所有数据点,则属于插值问题;如果只要求曲线逼近这些数据点,则属于逼近问题。)2、Bezier曲线的定义p(t)=∑i=0naifi,n(t)p(t)=\sum_{i=0}^na_if_{i,n}(t)p(t)=i=0∑n​ai​fi,n…

大家好,又见面了,我是你们的朋友全栈君。

一、Bezier曲线

1、Bezier曲线的背景

给定n+1个数据点,p0~pn,生成一条曲线,使得该曲线与这些点描述的形状相符。
(如果要求曲线通过所有数据点,则属于插值问题;如果只要求曲线逼近这些数据点,则属于逼近问题。)

2、Bezier曲线的定义

p ( t ) = ∑ i = 0 n a i f i , n ( t ) p(t) = \sum_{i=0}^n a_if_{i,n}(t) p(t)=i=0naifi,n(t)
基函数(无证明)在这里插入图片描述
1972,Forest证明了Bezier曲线的基函数可以简化成伯恩斯坦基函数
B i , n ( t ) = C n i t i ( 1 − t ) n − 1 = n ! i ! ( n − i ) ! t i ( 1 − t ) n − i . B_{i,n}(t)=C_n^i t^{i} {(1-t)}^{n-1}= \frac {n!}{i!(n-i)!}t^i (1-t)^{n-i}. Bi,n(t)=Cniti(1t)n1=i!(ni)!n!ti(1t)ni.
∑ i = 0 n B i , n ( t ) 恰 好 是 二 项 式 t + ( 1 − t ) n 的 展 开 式 \sum_{i=0}^n B_{i,n}(t)恰好是二项式{t+(1-t)}^n的展开式 i=0nBi,n(t)t+(1t)n

在这里插入图片描述
从p0端到pn的末端所形成的折线称为控制多边形或贝塞尔多边形

3、Bezier曲线举例

(1)一次Bezier曲线
p ( t ) = ∑ i = 0 n P i B i , n ( t ) p(t) = \sum_{i=0}^n P_i B_{i,n}(t) p(t)=i=0nPiBi,n(t)
t[0,1]

当n=1时,有两个控制点p0和p1,Bezier多项式是一次多项式:
p ( t ) = ∑ i = 0 1 P i B i , 1 ( t ) = P 0 B 0 , 1 ( t ) + P 1 B 1 , 1 ( t ) p(t) = \sum_{i=0}^1 P_i B_{i,1}(t) =P_0 B_{0,1}(t)+P_1 B_{1,1}(t) p(t)=i=01PiBi,1(t)=P0B0,1(t)+P1B1,1(t)
p ( t ) = ( 1 − t ) P 0 + t P 1 p(t) =(1-t)P_0+tP_1 p(t)=(1t)P0+tP1
即为连接起点p0和终点p1的直线段
(2)二次Bezier曲线
p ( t ) = ∑ i = 0 n P i B i , n ( t ) p(t) = \sum_{i=0}^n P_i B_{i,n}(t) p(t)=i=0nPiBi,n(t)
t[0,1]
当n=2时,有3个控制点p0、p1和p2,Bezier多项式是二次多项式:
p ( t ) = ∑ i = 0 2 P i B i , 2 ( t ) = P 0 B 0 , 2 ( t ) + P 1 B 1 , 2 ( t ) + + P 2 B 2 , 2 ( t ) p(t) = \sum_{i=0}^2 P_i B_{i,2}(t) =P_0 B_{0,2}(t)+P_1 B_{1,2}(t)++P_2 B_{2,2}(t) p(t)=i=02PiBi,2(t)=P0B0,2(t)+P1B1,2(t)++P2B2,2(t)
p ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 p(t) =(1-t)^2P_0+2t (1-t) P_1+t^2 P_2 p(t)=(1t)2P0+2t(1t)P1+t2P2
其矩阵形式为:
p ( t ) = [ t 2 t 1 ] ∗ [ 1 − 2 1 − 2 2 0 1 0 0 ] ∗ [ P 0 P 1 P 2 ] p(t) = \begin{gathered} \begin{bmatrix} t^2 & t & 1\end{bmatrix} *\begin{bmatrix} 1 & -2 & 1\\ -2 & 2 & 0\\1 & 0 & 0 \end{bmatrix} *\begin{bmatrix} P_0 \\ P_1 \\ P_2\end{bmatrix} \end{gathered} p(t)=[t2t1]121220100P0P1P2
(3)三次Bezier曲线
当n=3时,有4个控制点p0、p1、p2和p3,Bezier多项式是三次多项式:
p ( t ) = ∑ i = 0 3 P i B i , 3 ( t ) = P 0 B 0 , 3 ( t ) + P 1 B 1 , 3 ( t ) + P 2 B 2 , 3 ( t ) + P 3 B 3 , 3 ( t ) p(t) = \sum_{i=0}^3 P_i B_{i,3}(t) =P_0 B_{0,3}(t)+P_1 B_{1,3}(t)+P_2 B_{2,3}(t)+P_3 B_{3,3}(t) p(t)=i=03PiBi,3(t)=P0B0,3(t)+P1B1,3(t)+P2B2,3(t)+P3B3,3(t)
p ( t ) = ( 1 − t 3 ) P 0 + 3 t ( 1 − t ) 2 P 1 + 3 t 2 ( 1 − t ) P 2 + t 3 P 3 p(t) =(1-t^3) P_0+3t (1-t)^2 P_1+3 t^2 (1-t) P_2+t^3 P_3 p(t)=(1t3)P0+3t(1t)2P1+3t2(1t)P2+t3P3
每个基函数在参数t的整个(0,1)的开区间范围内不为0
其矩阵形式为:
p ( t ) = [ t 3 t 2 t 1 ] ∗ [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] ∗ [ P 0 P 1 P 2 P 3 ] p(t) = \begin{gathered} \begin{bmatrix} t^3 & t^2 & t & 1\end{bmatrix} *\begin{bmatrix} -1 & 3 & -3 & 1\\ 3 & -6 & 3 & 0\\-3 & 3 & 0 & 0\\1 & 0 &0 & 0 \end{bmatrix} *\begin{bmatrix} P_0 \\ P_1 \\ P_2\\P_3\end{bmatrix} \end{gathered} p(t)=[t3t2t1]1331363033001000P0P1P2P3
基函数具有递推性
B i , n ( t ) = ( 1 − t ) B i , n − 1 ( t ) + t B i − 1 , n − 1 ( t ) B_{i,n}(t) = (1-t) B_{i,n-1}(t) +t B_{i-1,n-1}(t) Bi,n(t)=(1t)Bi,n1(t)+tBi1,n1(t)

4、Bezier曲线性质

(1)端点性质
顶点p0和pn分别位于实际曲线段的起点和终点上
(2)一阶导数
基函数的一阶导数为:
B i , n ′ ( t ) = n [ B i − 1 , n − 1 ( t ) − B i , n − 1 ( t ) ] B_{i,n}^{‘}(t) =n[ B_{i-1,n-1}(t) – B_{i,n-1}(t) ] Bi,n(t)=n[Bi1,n1(t)Bi,n1(t)]

p ′ ( t ) = n ∑ i = 1 n ( p i − p i − 1 ) B i − 1 , n − 1 ( t ) p^{‘}(t) =n \sum_{i=1}^n (p_i-p_{i-1})B_{i-1,n-1}(t) p(t)=ni=1n(pipi1)Bi1,n1(t)
这说明Bezier曲线的七点和终点处的切线方向和特征多边形的第一条边及最后一条边的走向一致
(3)几何不变性
指某些几何特性不随坐标变换而变化的特性。Bezier曲线的形状仅与控制多边形各顶点的相对位置有关,而与坐标系的选择无关
(4)变差缩减性
若Bezier曲线的特征多边形是一个平面图形,则平面内任意直线与p(t)的交点个数不多于该直线与其特征多边形的交点个数,这一性质叫变差缩减性质
在这里插入图片描述
此性质反映了Bezier曲线比其特征多边形的波动还小,也就是说Bezier曲线比特征多边形的折线更光滑

5、Bezier曲线的生成

(1)定义法
(2)Bezier曲线的递推(de Castel jau)算法
在这里插入图片描述

二、B样条曲线

1、B样条曲线的背景

Bezier曲线存在的不足:
(1)一旦确定了特征多边形的顶点数(n+1)个,也就决定了曲线的阶次(n)次
(2)Bezier曲线或曲面的拼接比较复杂
(3)Bezier曲线或曲面不能作局部修改

2、B样条曲线的定义

B样条曲线的数学表达式为:
P ( u ) = ∑ i = 0 n P i B i , k ( u ) u ∈ [ u k − 1 , u n + 1 ] P(u) = \sum_{i=0}^n P_i B_{i,k}(u) \\u\in[u_{k-1},u_{n+1}] P(u)=i=0nPiBi,k(u)u[uk1,un+1]
Bezier曲线:
p ( t ) = ∑ i = 0 n P i B i , n ( t ) p(t) = \sum_{i=0}^n P_i B_{i,n}(t) p(t)=i=0nPiBi,n(t)
B{i,k}(u) 称为k阶(k-1)次B样条基函数,k是刻画次数的。其中k可以是2到控制点个数n+1之间的任意整数。
对Bezier曲线来说,阶数和次数是一样的;但对B样条,阶数是次数加1

P ( u ) = ∑ i = 0 n P i B i , k ( u ) P(u) = \sum_{i=0}^n P_i B_{i,k}(u) P(u)=i=0nPiBi,k(u)
B样条基函数是一个称为节点矢量的非递减的参数u的序列所决定的k阶分段多项式,这个序列称为节点向量
在这里插入图片描述
de Boor-Cox递推定义
B样条基函数可以有各种各样的定义方式,但是公认的最容易理解的是de Boor-Cox递推定义

它的原理是,只要是k阶(k-1次)的B样条基函数,构造一种递推的公式,由0次构造1次,1次构造2次,2次构造3次,依此类推。
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)=\left\{ \begin{array}{rcl} 1 & & {u_i<u < u_{i+1}}\\ 0 & & {Otherwise}\\ \end{array} \right. Bi,1(u)={
10ui<u<ui+1Otherwise

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+k1uiuuiBi,k1(u)+ui+kui+1ui+kuBi+1,k1(u)并约定 0 0 = 0 \frac00=0 00=0
该递推公式表明:若确定第i个k阶B样条B_{i,k}(u),需要用到ui,……ui+k,共k+1个节点,称区间[ui,u_i+k]为B_{i,k}(u)的支撑区间

3、B样条基函数定义区间及节点向量

(1)B样条曲线定义区间是什么?
(2)对于n+1个顶点,k阶的B样条曲线需要多少个节点向量(ui)与之匹配


(1)k阶B样条对应的节点向量数
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)=\left\{ \begin{array}{rcl} 1 & & {u_i<u < u_{i+1}}\\ 0 & & {Otherwise}\\ \end{array} \right. Bi,1(u)={
10ui<u<ui+1Otherwise

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+k1uiuuiBi,k1(u)+ui+kui+1ui+kuBi+1,k1(u)
对于B_{i,1}(1阶0次基函数)来说,涉及ui到u_{i+1}一个区间,及一阶的多项式涉及一个区间两个节点
B_{i,2}是由B_{i,1}和B_{i+1,1}组成,因此B_{i,2}涉及2个区间3个节点;B_{i,3}设计3个区间4个节点……B_{i,k}涉及k个区间k+1个节点
(2)B样条函数定义区间
P ( u ) = ∑ i = 0 n P i B i , k ( u ) u ∈ [ u k − 1 , u n + 1 ] P(u) = \sum_{i=0}^n P_i B_{i,k}(u) \\u\in[u_{k-1},u_{n+1}] P(u)=i=0nPiBi,k(u)u[uk1,un+1]
例子:在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

4、B样条基函数的主要性质

(1)局部支撑性
(2)权性
(3)连续性
(4)分段参数多项式

5、B样条函数的主要性质

(1)、局部性:
k阶B样条曲线上的一点至多与k个控制顶点有关,与其他控制顶点无关
移动曲线的第i个控制顶点pi,至多影响到定义在区间上那部分曲线的形状,对曲线其余部分不发生影响
(2)、变差缩减性(同Beizer)
(3)、几何不变性
(4)、凸包性:
在这里插入图片描述

6、B样条曲线类型的划分

(1)、均匀B样条曲线(uniform B-spline curve)
当节点沿参数轴均匀等距分布,即u_{i+1}-ui=常熟>0时,表示均匀B样条函数
{0,1,2,3,4,5,6}
均匀B样条的基函数呈周期性。即给定n和k,所有基函数有相同形状。每个后续基函数仅仅是前面基函数在新位置上的重复

(2)准均匀B样条曲线(Quai-uniform B-spline curve)
与均匀B样条曲线的差别在于两端节点具有重复度k,这样的节点矢量定义了准均匀的B样条基
均匀:u=(0,1,2,3,4,5,6)
准均匀:u=(0,0,0,1,2,3,4,5,5,5)

在这里插入图片描述(3)、分段Bezier曲线
(4)非均匀B样条曲线

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151260.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Numpy学习笔记二——初始化数组的10种方法

    Numpy学习笔记二——初始化数组的10种方法importnumpyasnp#创建一个长度为10的数组,数组的值都是0np.zeros(10,dtype=int)#创建一个3×5的浮点型数组,数组的值都是1np.ones((3,5),dtype=float)#创建一个3×5的浮点型数组,数组的值都是3.14np.full((3,5),3.14)#创建一个3×5的浮点型数组,数组的值是一个线性序列#从o开始,到20结束,步…

    2022年10月20日
    1
  • 卸载oracle数据库

    卸载oracle数据库

    2021年11月14日
    45
  • MT4行情交易API接口开发手记

    MT4行情交易API接口开发手记之前开发的外汇量化交易系统,行情和交易接口都是通过在MT4平台下编写EA来实现,具体方法是:1、用C++编写一个动态库文件,在里面实现行情和交易数据调用接口,将报价数据和K线数据写入数据库中,并从数据库中获取外汇量化系统发出的交易指令。2、在MT4中编写EA文件,在MT4上不间断运行,从MT4平台实时获取报价和K线数据,并调用动态库写入数据库中,于此同时,不断从数据库中获取交易指令,再调用MT4的交易指令完成交易。采用此种方法的好处就是兼容性强,只要打开MT4软件运行EA,就可以完成行情和交易接..

    2022年5月30日
    163
  • 虚拟机usb设备连接不成功_ssh怎么连接虚拟机

    虚拟机usb设备连接不成功_ssh怎么连接虚拟机解决【使用shell连接虚拟机时连接等待时长过长】的问题打开sshd服务的配置文件/etc/ssh/sshd_config把UseDNSyes,改为UseDNSno重启ssh服务打开sshd服务的配置文件/etc/ssh/sshd_config以管理员身份输入下面的命令:vi/etc/ssh/sshd_config把UseDNSyes,改为UseDNSno1、按下键盘的I键,进入编辑模式2、找到UseDNSyes,把注释#去掉,把yes修改为no3、按下键盘的Esc键,并

    2022年9月22日
    2
  • asp.net 跳转页面[通俗易懂]

    asp.net 跳转页面[通俗易懂]①response.redirect这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但他可以跳转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录保护。但速度慢是其最大缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端。需要注意的是跳转后内部空间保存的所有数据信息将会

    2022年7月20日
    15
  • 什么是防抖和节流?如何实现防抖和节流?

    什么是防抖和节流?如何实现防抖和节流?防抖 Debounce 和节流 Throttle 都是用来控制某个函数在一定时间内触发次数 两者都是为了减少触发频率 以便提高性能或者说避免资源浪费 毕竟 JS 操作 DOM 对象的代价还是十分昂贵的 应用场景 处理一些频繁触发的事件 例如 mousedown mousemove keyup keydown 等 不然的话 页面很可能会十分卡顿哦 防抖防抖就是指触发事件后在 n 秒内函数只能执行一次 如果在 n 秒内又触发了事件 则会重新计算函数执行时间 举个例子吧 例如 你是一个肯德基外卖配送员 每天专门

    2025年6月24日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号