首页 > 编程知识 正文

b样条曲线 C++实现,b样条曲线和bezier曲线

时间:2023-05-04 19:29:29 阅读:48422 作者:3570

关键字: NURBS、基函数、控制点、节点、

另一个好故事是https://www.cn blogs.com/ICM Zn/p/5100761.html

看了网上很多相关资料才能下笔,资料太多了,这里就不列举了。 感谢大人物的资料

这个博客顺序不好,你可能需要看后面的东西才能看到前面的东西。 我在努力修炼,请谅解

3358 www.Sina.com/https://download.csdn.net/download/QQ _ 40597317/10646881,http://www.Sina.com /

另一方面,定义写了个B样条曲线计算的完成程序,包括绘图,是b样条曲线(一个区间内所有样条函数构成一个线性空间)。 此线性空间的基函数称为b样条基函数)的线性组合。

b样条曲线是贝塞尔曲线的一般化,b样条曲线不能表示基本曲线(如圆),因此可以引入NURBS并将其推广到非均匀有理b样条曲线(NURBS )。 三方关系可以表示如下。

3358www.Sina.com/subdividing曲线很难。 因此,我们将曲线的定义域细分。 因此,如果曲线的定义域为[ 0,1 ],则该封闭区间被细分为被称为节点(knots )的点。 将这些节点设为0=u0=u1=.=um=1。 那么,点c(UI )的曲线细分如下图所示。 因此,修改[ 0,1 ]细分会改变曲线的形状。

如下图所示,这里有5条曲线构成了整个曲线。 以下直线的定义域为[ 0,1 ],[ 0,1 ]分为五个段

这里定义域用BaseFunction部分参考了https://www.cnblogs.com/nobodyzhou/p/5451528.html 侵删 重点就是由于规定了0/0=0,所以最需要注意的地方,原作者的思路是如果除数为0,就让除数为1,然后继续运算。这个思路真的很棒,如果被除数为0的话,那么结果就是0,否则的话结果就是被除数了。显然也没有人要求到这点。运行图像结果如下:细分,可以看出,节点分别可以用0、0.2、0.4、0.6、0.8、1、6个节点来定义域,即下面的黑线正好分成5个阶段。

可见,6个节点分别与曲线上的1个点相对应,被称为表示对应曲线上的点的节点(knot point ),节点将b样条曲线分割为5个曲线段,每个曲线段定义在一个节点区间上。 这些曲线段都是p阶贝塞尔曲线。

1.1 概述

那么称为节点,显然上述的m=5

设u为m 1个非减少数的集合,则有。 集合u被称为http://www.Sina.com/(knotvector )。

如果是这样,则http://www.Sina.com/(multiplicity )是k的多重节点,k1。 否则,如果一个节点只出现一次,这就是简单节点。 节点等间隔时,节点向量或节点序列称为均匀; 否则就不均匀了。

在第I个节点的区间中,I=0,1,m

的b样条函数都假定在定义域中,通常是0、1

3358www.Sina.com/总之,为了设计b样条曲线,需要设计一系列细分定义域、一系列3358www.Sina.com/和一系列http://www.Sina.com

连接多个贝塞尔曲线时,得到b样条曲线。

如下图所示,这里有8个控制点,依次用线段连接。 b样条曲线由一系列五条三次贝塞尔曲线连接而成。

一般阶数越低,即p越小,b样条曲线越容易接近他的控制多段线

二、特征节点B样条由一系列控制点确定,而b样条不通过该控制点。

3358www.Sina.com/或更高版本的所有节点(knots)对于分段的贝塞尔曲线,不同的曲线段彼此独立,移动控制点仅影响其所在的贝塞尔曲线段,其他

核心思想是节点向量

重复度Bezier曲线/曲面不支持局部修改和编辑;

贝塞尔曲线/曲面拼接非常难满足几何连续条件。

三、数学表示3.1一般表示有n 1个控制点pi (I=0,1,n )和一个节点向量,依次连接这些1.2 组成)可以构成一个特征多边

形,k+1阶(k次)B样条曲线的表达式为(2<=k<=n+1),必须满足m=n+k+1

其中是k次B样条基函数,也叫调和函数,或者 k次规范B样条基函数,下面为其递归公式(这个公式叫Cox-de Boor)的定义

显然,基函数由U定义,其中基函数满足微分方程:

上图是基函数的运算关系,从左向右,从上往下可以依次计算各个基函数

基函数:

基函数只在附近的一个子区间非0,这就是局部的概念。(不明白的)

基函数表示基函数的次数(degree)为k,这是第i个k次B样条基函数,i=0,1,...

 

四、性质 4.1 基函数的性质 1. 局部支撑性

若,那么

2.

在任意给定节点区间,最多p+1个非零,分别是

3.非负性

4.规范性

任意给定节点区间,时

可微性

在节点内部,无限次可微,时,

4.2 凸包包含

样条曲线包含在控制折线(ployline)的凸包内。更特别地,如果u 在节点区间[ui,ui+1)里,那么C(u)在控制点Pi-p, Pi-p+1, ..., Pi的凸包里。

4.3 Pi 只影响在区间[ui, ui+p+1)上的曲线 C(u)

五、分类(根据节点向量中节点的分布) 5.1 均匀B样条曲线

(这里的节点可以理解为控制点)

节点成等差数列均匀分布

5.2 准均匀B样条曲线

两端节点0,1重复度为次数k的基础上加1,即k+1,即,所有内部节点重复度为k+1.

显然,首尾两边是相切的

5.3 分段Bezier曲线

两端节点重复度为k+1,内部节点重复度为k,显然此时必须满足条件(m-1)%k==0

5.4 非均匀B样条

任意选取的一个序列[u0,...,um],只要在数学上成立即可,这是最一般的情况

六、计算B样条上的一点的值 7.1 修改曲线的形状

可以修改一个或多个控制参数:控制点的位置(n+1),节点位置(m+1),和曲线的次数p。

一般为开(open )B-样条曲线,也就是产生的曲线不会与控制折线(polyline)的第一边(leg)和最后一边(leg)接触,如下图,对于开曲线,区间不会有基函数的完全支持(“full support”),就是指在这些区间上,只有一个非零基函数。所以有以下结论,对于开B样条曲线,定义域为

强制第一个节点和最后一个节点的重复度为p+1,那么产生的曲线就会分别与第一个控制点和最后一个控制点的第一边和最后一边相切,如下图,这是clamped B-样条曲线。注意,Clamped B-样条曲线C(u)通过首尾两个控制点 P0 和Pn

通过重复某些节点和控制点,产生的曲线会是  闭(closed)曲线。会产生闭环,如下图

如何产生闭曲线?

1.Wrapping控制点

(1)设计一个均匀 m+1 个节点的节点序列:u0 = 0, u1 = 1/m, u1 = 2/m, ..., um = 1。注意曲线的定义域是 [up, un-p].

(2)Wrap头p 个和最后p 个控制点。更准确地,设P0 = Pn-p+1, P1 = Pn-p+2, ..., Pp-2 = Pn-1 and Pp-1 = Pn. 

构建的曲线在连接点处 C(up) = C(un-p)是Cp-1 连续的。.

1.Wrapping节点

1)增加一个新控制点 Pn+1 = P0.因此,控制点的数目是 n+2.

(2)找到一个合适的有 n+1节点的节点序列u0, u1, ..., un 。这些节点不必要是均匀的

(3)增加 p+2 个节点并 wrap 头 p+2个节点: un+1 = u0, un+2 = u1, ..., un+p = up-1, un+p+1 = up, un+p+2 = up+1 ,如下图所示。这样,我们有n+p+2 = (n+1) + p + 1 个节点

(4)定义在上述构建的 n+1个控制点和n+p+2 个节点上的 p 次开B-样条曲线C(u)是一个闭曲线,在连接点处C(u0) = C(un+1)有Cp-1 连续性。注意闭曲线的定义域是 [u0, un+1]

七、例子 7.1 简单节点

节点向量是U = { 0, 0.25, 0.5, 0.75, 1 }

7.2 带正重复度的节点

这个比较简单,略略略

(4)后面的主要是B样条曲线的一些性质,暂时用不到,后续更新

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。