参数曲线(贝塞尔曲线、B样条曲线和NURBS曲线)

参数曲线

网页资料

相关概念

齐次坐标:齐次坐标到笛卡尔坐标的变换(x,y,z,w)(x/w,y/w,z/w)唯一,反之则不唯一

有理曲线:齐次形式的参数曲线称为有理曲线

连续性

Ck连续:ik,f(b)g(m)i阶导数在连接点处相等

几何连续性Gk连续有如下等价定义:

  • 以弧长为参数时,ik,f(b)g(m)i阶导数在连接点处相等;

  • 存在两个参数化方式,使得ik,f(b)g(m)i阶导数在连接点处相等;

注意:C2连续一定曲率连续,但曲率连续不一定C2连续

贝赛尔曲线

image

构建贝赛尔曲线

给定空间中n+1个控制点P0,P1,,Pn,由这些控制点定义的贝赛尔曲线为

C(u)=i=0nBn,i(u)Pi

其中系数定义如下

Bn,i(u)=n!i!(ni)!ui(1u)ni=Cniui(1u)ni

  • 贝塞尔曲线可视为对所有控制点的加权平均

  • 线段P0P1,P1P2,,Pn1Pn称为legs,按此顺序连接形成控制折线(control polyline)/控制多边形(control polygon)

  • Bn,i(u)称为贝塞尔基函数(Bézier basis functions)或伯恩斯坦多项式(Bernstein polynomials)

贝塞尔曲线具有以下性质:

  • n阶贝赛尔曲线由n+1个控制点定义

  • 贝塞尔曲线经过P0Pn,且在这两点处与控制折线相切

  • 非负性:所有基函数均非负

  • 单位分解(partition of unity):所有基函数之和为1

  • 凸包性质:贝塞尔曲线完全位于给定控制点的凸包内

  • 变分递减性质(variation diminishing property):没有一条直线与贝塞尔曲线相交的次数多于与曲线控制折线相交的次数

  • 仿射不变性(affine invariance):对贝塞尔曲线的仿射变换等价于对控制点的仿射变换

如果u[a,b],则可通过变换u=uaba[0,1]

移动控制点

image

原控制点Pk变为Pk+v后,新的贝塞尔曲线

D(u)=i=0k1Bn,i(u)Pi+Bn,k(u)(Pk+v)+i=k+1nBn,i(u)Pi=i=0nBn,i(u)Pi+Bn,k(u)v=C(u)+Bn,k(u)v

更改单个控制点,贝塞尔曲线上所有的点都将移动到新位置,曲线形状会发生整体的变化

image

德卡斯特里奥算法(de Casteljau's algorithm)

直接法(直接把u带入基函数,计算每个基函数与其对应控制点的乘积,最后将它们相加)计算贝塞尔曲线上点的坐标虽然速度快,但是数值不稳定

几何解释

image

定义第i次迭代得到的点的编号为i0,,i(ni),则控制点(第0次迭代)编号为00,,0n,步骤如下:

  1. 先对点00,,0n依次形成的线段进行操作,对于所有j[0,n1],在线段0j0(j+1)找一点,该点把该线段分成u:(1u)的两截,即得到如图中的点10,,1(n1)

  2. 对点10,,1(n1)依次形成的线段进行同样的操作,得到如图中的点20,,2(n2)

  3. 该操作重复n次之后会产生点n0,即得到贝塞尔曲线上的点C(u)

实际计算

image

计算步骤如下:

  1. 把所有控制点00,,0n排成如图最左边的一列,每相邻的两个控制点之间得到一个新点

  2. 新点为左边两个点的加权和,左上方的点权重为1u,左下方的点权重为u

  3. 按此规则迭代至得到n0,即得到贝塞尔曲线上的点C(u)

image

递归关系

Pi,j=(1u)Pi1,j+uPi1,j+1{i=1,2,,nj=0,1,,ni

直接按递归关系计算的函数为

image

上述函数会有大量的重复计算,如下图中的Pn2,1,导致计算效率低下

image

特殊性质

如果把某一列中一组连续的点作为贝塞尔曲线的控制点,那利用de Casteljau算法计算时,曲线上的点就是等边三角形内所选点形成的边的对面的顶点,如下图所示

image

算法的正确性

image        image

  1. 每个控制点对n0的贡献完全通过图示的平行四边形区域传播过去

  2. 控制点经过平行四边形中的每条路径都对n0有独立的贡献

  3. 考虑到一条路径传播的贡献只和起点与终点的相对位置有关,和路径形状无关,由0in0的每条路径的贡献均为ui(1u)ni

  4. 平行四边形内路径的总数恰好为组合数Cni=n!i!(ni)!

  5. 易得,所有路径的贡献总和满足贝塞尔曲线关系式

n!i!(ni)!ui(1u)ni0i=n!i!(ni)!ui(1u)niPi=Bn,i(u)Pi

贝塞尔曲线的导数

由于控制点是与u无关的常数,因此计算导数C(u)可以简化为计算Bn,i(u)的导数,满足

dduBn,i(u)=Bn,i(u)=n(Bn1,i1(u)Bn1,i(u))

定义Qi=n(Pi+1Pi),i[0,n1],则C(u)满足

dduC(u)=C(u)=i=0n1Bn1,i(u){n(Pi+1Pi)}=i=0n1Bn1,i(u)Qi

C(u)也被称为原贝塞尔曲线的速度图(hodograph)

连接贝塞尔曲线

  • 满足G1连续:前一条曲线的第一条leg和后一条曲线的最后一条leg满足如下图的关系

image

  • 满足C1连续:前一条曲线在u=1处的切向量和后一条曲线在u=0处的切向量方向和大小都一样

C(1)=m(PmPm1)=D(0)=n(Q1Q0)

导数与de Casteljau算法的关系

贝塞尔曲线的导数可写为

C(u)=i=0n1Bn1,i(u){n(Pi+1Pi)}=n[(i=0n1Bn,i(u)Pi+1)(i=0n1Bn,i(u)Pi)]

定义

C1(u)=i=0n1Bn,i(u)Pi+1C2(u)=i=0n1Bn,i(u)Pi

则贝塞尔曲线的导数可表示为

C(u)=n(C1(u)C2(u))

因此,理论上,可以使用de Casteljau算法来计算C1(u)C2(u),再计算差值,最后乘以n ,得到C(u)故利用de Casteljau算法可以同时计算出曲线C(u)上的点及其切向量C(u)下图显示了计算过程。

image

高阶导数

定义Di0=Pi,i[0,n],类似一阶导数的递推关系,贝塞尔曲线k阶导数的控制点满足有限差分关系

Dik=Di+1k1Dik10ink

则贝塞尔曲线的k阶导数可表示为

C[k](u)=n(n1)(n2)(nk+1)i=0nkBnk,i(u)(Di+1k1Dik1)=n(n1)(n2)(nk+1)i=0nkBnk,i(u)Dik

利用de Casteljau算法计算特定u下的k阶导数值的流程如下:

  1. k阶导数的控制点满足如下左图的关系,根据如下右图的思路计算第k列的点Dik=j=0k(1)kjCkjPi+j

image        image

  1. 把de Casteljau算法应用在第k列的点上得到导数值

贝塞尔曲线的分段

贝塞尔曲线的分段需要满足以下条件:

  • 将给定的贝塞尔曲线C(u)在某一点切割成[0,u][u,1]两段贝塞尔曲线,且有各自的新控制点

  • 新生成的贝塞尔曲线必须和原贝塞尔曲线同阶

贝塞尔曲线分段的新控制点可借助de Casteljau算法得到,以6阶贝塞尔曲线为例:

  • 左侧折线由点P00=P0,P10,P20,P30,P40,P50,P60=C(u)组成

  • 右侧折线由点P60=C(u),P51,P42,P33,P24,P15,P06=P6组成

image        image

  • 以上两组控制点也对应如下de Casteljau算法中红圈内顺箭头方向的一组点和蓝圈内逆箭头方向的一组点

image

算法的正确性

以原贝塞尔曲线[0,u]的部分为例,证明步骤如下:

  1. 设原曲线为

C(u)=i=0nBn,i(u)Pi

  1. 由de Casteljau算法的特殊性质可得,Pk0P0,P1,,Pk计算得到如下

Pk0=i=0kBk,i(u)Pi

  1. 将由P00=P0,P10,,P(n1)0,Pn0=C(u)定义的新贝塞尔曲线D(t)仍由原控制点P0,P1,,Pn表示,有

D(t)=k=0nBn,k(t)Pk0=k=0nBn,k(t)[i=0kBk,i(u)Pi]

  1. 考虑点Ph的系数,只有kh时,该系数才非0,计算如下

Ph的系数 =Bn,h(t)Bh,h(u)+Bn,h+1(t)Bh+1,h(u)++Bn,n(t)Bn,h(u)=j=0nhBn,h+j(t)Bh+j,h(u)=j=0nh[n!(h+j)!(n(h+j))!th+j(1t)n(h+j)][(h+j)!h!j!uh(1u)j]=(tu)h,n!,j!n!h!(tu)hj=0nh1((nh)j)!j![t(1u)]j[(1t)(nh)j]=(nh)!n!h!(nh)!(tu)hj=0nh(nh)!((nh)j)!j![t(1u)]j[(1t)(nh)j]=n!h!(nh)!(tu)h(1(tu))nh=Bn,h(tu)

  1. 由于t[0,1],且原贝塞尔曲线只取[0,u]的部分,则新曲线符合原曲线如下

D(t)=h=0nBn,h(tu)Ph=C(tu)

贝塞尔曲线的阶数提升(degree elevation)

阶数的提升要求不改变原贝塞尔曲线的形状,步骤如下

  1. 假设n阶贝塞尔曲线由n+1个控制点P0,P1,,Pn定义,需要增加阶数到n+1而不改变形状

  2. 由于升阶的曲线也经过P0Pn,故这两个点一定在新的控制点集合中

  3. 新控制点记为Q0,Q1,,Qn+1,则Q0=P0Qn+1=Pn,其他点计算如下

Qi=in+1Pi1+(1in+1)Pi1in

阶数提升算法类似de Casteljau算法,但比例不是常数

image

随着阶数提升,控制折线逐渐收敛至贝塞尔曲线image

算法的正确性

整体推导思路类似数学归纳法,利用两条曲线的任意阶导数处处相等的性质,通过使u=0处的各阶导数得到Q0,Q1,,Qn+1

该推导只说明了必要性,推导过程见网页

B样条(B-spline)曲线

B样条基函数

定义

不同于贝塞尔基函数,B样条基函数具有以下特点:

  • 定义域(domain)由节点划分

  • 只在几个相邻的子区间非零,而非在整个区间内都非零

首先引入如下定义:

概念 定义
节点(knots) 非递减序列u0u1um
节点向量(knot vector) U={u0,u1,,um}
i个节点区间(knot span) 半开半闭区间[ui,ui+1)
均匀(uniform)节点向量/节点序列 所有节点区间的跨度都相等
非均匀(non-uniform) 节点向量/节点序列 存在节点区间的跨度不相等
单节点(simple knot) 只出现1次的节点ui
重数(multiplicity)为k的重节点(multiple knot) 出现k次的节点ui,如ui=ui+1==ui+k1计节点数量时1个k重节点一般算k个节点

ip次B样条基函数Ni,p满足Cox-de Boor递归公式(recursion formula):

Ni,0(u)={1 if uiu<ui+10 otherwise Ni,p(u)=uuiui+puiNi,p1(u)+ui+p+1uui+p+1ui+1Ni+1,p1(u)

该递归公式可通过三角形的方案计算

image

特殊性质

  • 基函数Ni,p(u)p+1个区间[ui,ui+1),[ui+1,ui+2),,[ui+p,ui+p+1)上非零,或者说在区间[ui,ui+p+1)上非零

  • 任意节点区间[ui,ui+1)上至多有p+1p次基函数非零,依次为Nip,p(u),Nip+1,p(u),,Ni,p(u)

image        image

  • Ni,p(u)Ni,p1(u)Ni+1,p1(u)的线性组合,二者的系数为如下图的距离之比,均为u的线性函数且在[0,1)

image

重要性质

  • Ni,p(u)是关于up次多项式

  • 非负性:i,p,u,有Ni,p(u)非负

  • 局部支撑(local support):Ni,p(u)[ui,ui+p+1)上的非零多项式

  • 任意节点区间[ui,ui+1)上至多有p+1p次基函数非零,依次为Nip,p(u),Nip+1,p(u),,Ni,p(u)

  • 单位分解(partition of unity):区间[ui,ui+1)上所有p次基函数之和为1

  • 节点数为m+1p次基函数的数量为n+1,则有m=n+p+1

  • 基函数Ni,p(u)是由多个曲线组合而成的组合曲线(composite curve),其连接点为[ui,ui+p+1)内的节点

  • k重节点处,基函数Ni,p(u)满足Cpk连续

多重节点的影响

  • 每个k重节点最多减少基函数的k1个非零区间

    • k重节点可视为k个不同的节点移动到同一位置,则原k个不同的节点组成的k1个非零区间消失
  • k重节点的内部节点(internal knot)上,非零p次基函数的数量最多为pk+1

    • 单节点ui上至多有p+1个非零p次基函数

    • ui1移动至ui,则原来从ui1开始的非零基函数变为从ui开始,ui处的非零基函数减少1

    • ui+1移动至ui,则原来从ui+1结束的非零基函数变为从ui结束,ui处的非零基函数减少1

B样条曲线

定义

给定n+1个控制点P0,P1,,Pn和节点向量U={u0,u1,,um},则p次B样条曲线为

C(u)=i=0nNi,p(u)Pi

其中节点ui对应的点C(ui)knot point

B样条曲线可分为如下3类:开放(open)B样条曲线,固定(clamped)B样条曲线,闭合(closed)B样条曲线

image

固定曲线

固定曲线的前p+1和后p+1个节点必须相同,即首尾为p+1重节点

除首尾节点外其余节点分布均匀,故也称准均匀B样条曲线

开放曲线

如果首末节点的重数小于p+1,则B样条曲线不经过首末控制点,也不和首末legs相切

“完全支撑”(full support):节点区间[ui,ui+1)p次非零基函数的个数达到最大值p+1

在节点区间[u0,up)[ump,um]中没有基函数的“完全支撑”,故开放B样条曲线的定义域为[up,ump],且在部分节点区间未使用的情况下仍由所有控制点定义

考虑n=13,p=6,m=n+p+i=13的均匀开放B样条曲线,其定义域为[u6,u14]如下

image

闭合曲线

构造由n+1个控制点P0,P1,,Pn定义的p次闭合曲线的方法共有两种:

  • 包裹控制点(wrapping control points)

    • 构造步骤:

      1. 设计均匀节点序列u0=0,u1=1/m,u1=2/m,,um=1,此时曲线的定义域为[up,unp]

      2. 让首尾p个节点相等,即P0=Pnp+1,P1=Pnp+2,,Pp1=Pn,如下图的静态结构和动态过程

    • 曲线在C(up)=C(unp)处满足Cp1连续

image

image

image

  • 包裹节点(wrapping knots)

    • 网页中内容有误,思路可能是利用给定控制点,和与原节点向量部分相同的新节点向量,新构造一段B样条曲线使得原开放曲线闭合

    • 构造步骤:

      1. 添加新的控制点Pn+1=P0,由于首尾控制点重合,此时控制点个数可认为仍是n+1

      2. 找到合适的节点序列u0,u1,,un,该节点序列的优势在于不必为均匀的

      3. 添加和前p+2个节点相等的p+2个节点,即un+1=u0,un+2=u1,,un+p+2=up+1,以引导受Pn+1影响的曲线末端和受P0影响的曲线开端重合,此时节点数量为n+p+2

      4. 由上述n+1个控制点和n+p+2个节点定义的p次开放曲线即为闭合曲线

    • 曲线在C(u0)=C(un+1)处满足Cp1连续

    • 曲线定义域为[u0,un]

image

重要性质

  • B样条曲线是分段曲线,每一段都是p次曲线

    • 一般来说,次数越低,B样条曲线越接近其控制折线(以下三图的次数分别为7、5、3)

image

  • 必满足m=n+p+1

  • 固定B样条曲线经过P0Pn

    • 由于u0=u1==up=0,有N0,0(u),N1,0(u),.,Np1,0(u)为零,Np,0(u)非零,故Np,0(0)=1,则C(0)=P0,类似地有C(1)=Pn
  • 强凸包性质:如果u[ui,ui+1],则C(u)在控制点Pip,Pip+1,,Pi形成的凸包中

    • [ui,ui+1)上只有p+1个基函数Ni,p(u),,Nip+1,p(u),Nip,p(u)非零且和为1
  • 局部修改性质(local modification scheme):改变控制点Pi 只影响曲线C(u)[ui,ui+p+1]上的部分

  • C(u)k重节点处满足Cpk连续

  • 变分递减性质:如果曲线位于平面(或空间)中,则直线(或平面)与B样条曲线相交的次数不超过与曲线的控制折线相交的次数

  • 贝塞尔曲线是B样条曲线的特例:当n=p(对应节点数量为2(p+1))且分别有p+1个节点固定在首尾时,B样条曲线等价于贝塞尔曲线

  • 仿射不变性:对B样条曲线的仿射变换等价于对控制点的仿射变换

优点:

  • B样条曲线可以转化为贝塞尔曲线

  • B样条曲线满足贝塞尔曲线的所有性质

  • B样条曲线控制更灵活

    • 曲线的次数与控制点的数量相对独立,使用较低次数的曲线仍可保持大量控制点

    • 可改变控制点的位置进行局部而非全局修改

    • 强凸包性质带来更精细的形状控制

缺点:

  • 不能表示部分曲线,例如圆和椭圆,需要用到NURBS曲线

重要算法

节点插入

单次插入

节点插入:

  • 在现有的节点向量中添加一个新的节点,而不改变曲线的形状

  • 新节点可以和原节点相等,使得其重数加1

  • 控制点数量必须加1(曲线次数改变会影响全局的形状,因此须保持不变)

若新节点t[uk,uk+1),则插入步骤为:

  1. C(t)位于Pk,Pk1,,Pkp定义的凸包内,且其他控制点的基函数为零,故只需要考虑Pk,Pk1,,Pkp的变化

  2. 需要找到p个新控制点Qi位于legPi1Pi上,i[kp+1,k],替代p1个原控制点Pk+1,Pk2,,Pkp1

image

  1. 新控制点Qi满足如下公式和图示

Qi=(1ai)Pi1+aiPiai=tuiui+pui

image

多次插入

如在[uk,uk+1)中插入h次新节点t,则插入步骤为:

  1. 系数ai,h满足

ai,h=tuiui+p(h1)ui

  1. 插入h次新节点ts重节点uk,则可:

    1. 列出受影响的p+1原始控制点作为第0列

    2. 忽略最后s个控制点Pks+1,Pks+2,,Pk

    3. 依次计算第1到第h

    4. 新的控制点如下图蓝色多边形内所示

image

计算步骤总结如下图

image

计算过程可理解为如下割角(corner cutting)的过程

image

德布尔算法(de Boor's algorithm)

de Boor算法用于计算在特定u处的B样条曲线上的点,其整体思想为:

  • 增加节点重数会减少该节点处非零基函数的数量

  • k重节点处最多有pk+1个非零基函数,故p重节点(记为ui)处最多有唯一非零基函数

  • 考虑单位分解性质,该唯一非零基函数在该p重节点处的值恰好为1,即C(u)=Ni,p(u)Pi=Pi

  • 如果重复插入新节点u至其重数为p,则最后生成的新控制点即为原B样条曲线在u处的点C(u)

de Boor算法的流程可总结如下

image

得到最后生成的新控制点Pks,ps和割角的过程如下图

image

de Boor算法和de Casteljau算法的不同如下

de Boor算法 de Casteljau算法
计算新控制点的系数 由列和控制点的序数决定 为定值u1u
参与计算的控制点 只有p+1个受影响的控制点 所有控制点

当节点向量中只有两个重数为n+1的节点时,de Boor算法等价于de Casteljau算法,有

ai=uuiui+nun=ui[1,n]

B样条曲线的分段

B样条曲线的分段使用de Boor算法,其余和贝塞尔曲线的分段完全相同

把B样条曲线分为[0,u][u,1]上两段B样条曲线的步骤如下:

  1. 选择控制点

    1. 使用de Boor算法插入新节点u

    2. P0开始沿控制折线前进,当遇到原控制点或者在de Boor算法中计算得到的控制点时,选中该点并转向,直至到达并选中C(u)

    3. 上述过程中选中的点作为[0,u]上的B样条曲线的控制点

    4. [u,1]上的B样条曲线的控制点采用相同的方式获得,只是路径改为从C(u)出发直至到达Pn

    5. 上述操作如下左图所示,选出的控制点满足下右图的三角形计算方案中蓝色多边形显示的关系

image        image

  1. 选择节点

    1. 增加p+1重节点u,使得分段后的两段B样条曲线经过C(u)

    2. [0,u]上的B样条曲线的节点依次为[0,u)上所有的原节点和p+1重节点u

    3. [u,1]上的B样条曲线的节点依次为p+1重节点u(u,1]上所有的原节点

如果p次B样条曲线在其节点处分段,则每段曲线都是p次贝塞尔曲线,但此操作有如下缺点:

  • 会引入大量新的控制点

  • B样条曲线在k重节点处满足Cpk连续,且不受移动控制点的影响,但分段后在贝塞尔曲线之间保持该连续性较为困难

NURBS曲线

NURBS(Non-Uniform Rational B-Splines)曲线,即非均匀有理B样条曲线,是B样条曲线通过齐次坐标到有理曲线的推广,可表示圆、椭圆和许多其他不能用多项式表示的曲线

定义

给定n+1个控制点P0,P1,,Pm+1个节点的节点向量U={u0,u1,,um},则由此定义的p阶B样条曲线为

C(u)=i=0nNi,p(u)Pi

把控制点Pi重写为

Pi=[xiyizi1]

将上述Pi视为齐次坐标,则其与非零常数相乘不改变其位置,故与权重wi相乘得到与Pi位置相同的新形式

Piw=[wixiwiyiwiziwi]

Piw带入B样条曲线的表达式中有

Cw(u)=i=0nNi,p(u)Piw=i=0nNi,p(u)[wixiwiyiwiziwi]=[i=0nNi,p(u)(wixi)i=0nNi,p(u)(wiyi)i=0nNi,p(u)(wizi)i=0nNi,p(u)wi]

Cw(u)是其次坐标形式的原始B样条曲线,其除以第四个坐标后可转换回笛卡尔坐标

C(u)=[i=0nNi,p(u)(wixi)i=0nNi,p(u)wii=0nNi,p(u)(wiyi)i=0nNi,p(u)wii=0nNi,p(u)(wizi)i=0nNi,p(u)wi1]=i=0nNi,p(u)wij=0nNj,p(u)wj[xiyizi1]

最后得到的表达式为

C(u)=1i=0nNi,p(u)wii=0nNi,p(u)wiPi

NURBS曲线有如下易得的结论:

  • 若所有权中均为1,则NURBS曲线退化为B样条曲线

  • NURBS曲线是有理的

  • 三维空间中的NURBS曲线仅仅是四维空间中B样条曲线的射影

重要性质

给定n+1个控制点P0,P1,,P和对应的非负权重wi,以及m+1个节点的节点向量U={u0,u1,,um},则由此定义的p次NURBS曲线为

C(u)=i=0nRi,p(u)Pi

其中

Ri,p(u)=Ni,p(u)wij=0nNj,p(u)wj

NURBS基函数的重要性质

  • Ri,p(u)是关于up次有理函数

  • 非负性:i,p,有Ri,p(u)0

  • 局部支撑:假设wi>0,则和Ni,p(u)一样,Ri,p(u)[ui,ui+p+1)上非零

  • 在任意节点区间[ui,ui+p+1)上,至多有p+1个非零p次基函数Rip,p(u),Rip+1,p(u),,,Ri,p(u)

  • 单位分解:节点区间[ui,ui+p+1)上的所有非零p次基函数之和为1

  • 节点数为m+1p次基函数的数量为n+1,则有m=n+p+1

  • 基函数Ri,p(u)是由多个曲线组合而成的组合曲线,其连接点为[ui,ui+p+1)内的节点

  • k重节点处,基函数Ri,p(u)满足Cpk连续

  • 如果i,有wi=c0,则Ri,p(u)=Ni,p(u)

NURBS曲线的重要性质

  • NURBS曲线C(u)为分段曲线,每一段为p次有理贝塞尔曲线

  • 必有m=n+p+1

  • 强凸包性质:如果u[ui,ui+1]且所有权重非负,则C(u)在控制点Pip,Pip+1,,Pi形成的凸包中

  • 局部修改性质:改变控制点Pi 只影响曲线C(u)[ui,ui+p+1]上的部分

  • C(u)k重节点处满足Cpk连续

  • 变分递减性质:如果曲线位于平面(或空间)中,则直线(或平面)与B样条曲线相交的次数不超过与曲线的控制折线相交的次数

  • 贝塞尔曲线和B样条曲线是NURBS曲线的特例

    • 当所有权重相等,NURBS曲线等价于B样条曲线

    • 当所有权重相等,n=p(对应节点数量为2(p+1))且分别有p+1个节点固定在首尾时,B样条曲线等价于贝塞尔曲线

  • 射影不变性(projective invariance):对NURBS曲线的射影变换等价于对控制点的射影変換

节点插入算法

节点插入的步骤如下(例子见网页):

  1. 把给定的三维NURBS曲线转换为四维的B样条曲线

  2. 对四维的B样条曲线进行节点插入

  3. 把新的控制点集射影回三维

有理贝塞尔曲线

把四维贝塞尔曲线射影到超平面w=1可得到三维有理贝塞尔曲线,其表达式为

C(u)=i=0nRi,p(u)Pi

其中

Ri,p(u)=Bi,p(u)wij=0nBj,p(u)wj

有理贝塞尔曲线具有以下特点:

  • 不具有局部修改性质

  • 满足射影不变性质(仿射变换是射影变换的子集)

圆锥曲线

唯一确定圆锥曲线的五个条件:

  • 由三个非共线点P0=(U0,V0),P1=(U1,V1),P2=(U2,V2)定义的2阶贝塞尔曲线为抛物线

  • 假设圆锥曲线经过P0,P2,且在P0,P2处分别和P0P1,P2P1相切,用2次隐式方程表示如下,其中6个系数为未知数

p(x,y)=ax2+2bxy+cy2+2dx+2ey+f=0

  • 如果f0,则有只包含五个未知数的方程如下

ax2+2bxy+cy2+2dx+2ey+1=0

  • 方程的梯度如下

p(x,y)=2ax+2by+2d,2bx+2cy+2e

  • 目前可以得到四个方程

    1. P0在曲线上:aU02+2bU0V0+cV02+2dU0+2eV0+1=0

    2. P2在曲线上:aU22+2bU2V2+cV22+2dU2+2eV2+1=0

    3. P0处和P0P1相切,则切向量和法向量垂直:V1V0U1U0=aU0+bV0+dbU0+cV0+e

    4. P2处和P2P1相切,则切向量和法向量垂直:V2V1U2U1=aU2+bV2+dbU2+cV2+e

  • 第五个方程则需要再找到一个在曲线上的点,改点应位于控制三角形的内部,以保持凸包性质

  • 该点受控制点P1的权重的影响,故可使用由P0,P1,P2定义的有理贝塞尔曲线,其权重依次为1、w、1,则控制点的系数如下

B2,0(u)=(1u)2B2,1(u)=2(1u)uB2,2(u)=u2

  • 2次有理贝塞尔曲线的表达式为

C(u)=1(1u)2+2(1u)uw+u2((1u)2P0+2(1u)uwP1+u2P2)

  • 通过把P0,P2置于原点两侧,且P0P2的中点位于原点,则有P0=P2,进一步有C(0.5)=w1+wP1=|MX||MP1|P1

image

  • 根据射影几何中的定理,由三个非共线控制点P0,P1,P2和其各自的权重1、w、1定义的有理贝塞尔曲线满足:

    • w>1时,为双曲线(hyperbola)

    • w=1时,为抛物线(parabola)

    • w<1时,为椭圆(ellipse)

圆弧和圆

圆弧使用有理贝塞尔曲线表示,整圆使用NURBS曲线表示,详情见网页

圆弧

圆是椭圆的特例,根据下图所示关系和圆锥曲线小节内容,w=sin(a)时可表示弦P0P2对应的圆弧

image

整圆

多个圆弧拼接在一起即为整圆:

  • 用三角形定义整圆,则节点为0,0,0,1/3,1/3,2/3,2/3,1,1,1

  • 用正方形定义整圆,则节点为0,0,0,1/4,1/4,1/2,1/2,3/4,3/4,1,1,1

image

posted @   Roanapur  阅读(1719)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示