NURBS曲线-节点插入(原理+代码)

article/2025/8/20 15:37:35

目录

1.概念及作用

 2.原理及流程

        1)修改插入位置所在曲线的控制点

        2)修改受影响控制点的权值

        3)原节点矢量中新增目标节点

3.源码加注释

4.补充


1.概念及作用

        设N为在节点矢量U={u_0,u_1,......,u_m}上的NURBS曲线,将U’∈[u_k,u_k+1]插入曲线N中,生成新的节点矢量U={u'_0 = u_0,......,u'_k = u_k,u'_k+1= u_k,......,u'_m+1= u_m},此时仅改变向量空间基底,并不改变曲线的几何和参数化信息。

        通俗点讲,节点插入就是在曲线的节点矢量中新增一个节点,该节点既可以插入在原有两节点之间,也可以重复插入在某一原有节点上。在插入一个节点后,原有的曲线形态不发生改变,但会影响被插入部分的局部曲线控制点的位置(原因在后文解释)。        

 2.原理及流程

        节点插入实例如下图3次Nurbs(p = 3)所示,其中Pi(i∈0~6)为插入前控制点,红色标记为插入前节点矢量Uk[0,0,0,0,1,2,3,4,5,5,5,5],图下方横轴表示节点矢量轴,每一个标记为一个节点,紧密相邻的节点表示在该处有重复节点。现向其中插入节点U_Bar=2.5,由于U5 < U_Bar < U6,故插入位置k=5(如图中蓝色节点所示)。

        插入该节点后,为了保证曲线形态保持不变,会进行哪些操作呢?

        1)修改插入位置所在曲线的控制点

        根据Nurbs曲线的局部性可知,相邻节点间的曲线由p+1个控制点控制(图中节点U5-U6段对应控制点P2~P5)。当向这段曲线间插入一个节点时,首尾控制点的α值分别为1和0(图中P2和P5),故Q2 = P2,Q6 = P5,这两点不发生改变,内部p+1-2个控制点会因1个节点的插入而增加为p+1-2+1个控制点(即图中控制点P3和P4会经重新计算生成Q3、Q4、Q5),新生成的控制点计算公式为(公式推导可参考The NURBS book-Chapter.5.2):

        上述公式可以看出,先由相关被插入的节点U_Bar和相关的U计算出α,再根据α重新由相邻控制点计算出新的控制点。

        概括一下:由于新增节点,会导致该节点位置所在曲线的原有控制点发生改变,计算生成p个新的控制点。

        2)修改受影响控制点的权值

        其实2)对于有一定基础的人来说应该是放在1)中一起讲的,但不幸本人在刚开始学习的时候毫无基础,在权值这里踩了大坑,因此认为分开讲对于初学者来说会更容易理解些。

        请仔细看1)中的公式,这里的Q和P右上角都带了w(带有权值),其实这里每个控制点不单单包含三维空间中的x,y,z,它实际上是四维的,其中还包含了权值w,因此,除了受影响的p+1-2+1个控制点需按上述公式计算外,每个控制点本身对应的权值也需要按同样的方法计算。并且在控制点的计算过程中,新控制点不能单单的通过相邻控制点的x,y,z值得到,还需要将原本的权值也纳入公式计算,并在新的控制点生成后,将其除以权值。(这里但看有些抽象,可以结合文末的代码一起看)

        概括一下:不仅权值需要按上述公式计算,由于控制点是四维的,控制点的计算过程中也需代入权值。

        3)原节点矢量中新增目标节点

        这部分就比较简单,因为新插入了一个节点U=2.5,原有的节点向量中要在k=5的位置新加入这个节点。

3.源码加注释

//向Nurbs中插入新的控制点,返回新的曲线
//输入:Nurbs曲线,插入的节点值,位置(从0开始),重复度(插入前的重复度),插入次数
NURBSpline InsertPoint(const NURBSpline& Sp1, double u, int k, int s, int r) {std::vector<double> w_aft(Sp1.n + r);	//插入后的权值std::vector<double> w_tem(Sp1.k - s + 1);	//插入影响的权值int U_num1 = Sp1.n + Sp1.k + 1, U_num2;	//插入前Sp1节点个数和插入后Sp2节点个数int C_num2 = Sp1.n + r;	//插入后Sp2的控制点个数std::vector<POINT> C_aft(Sp1.n + r);	//插入后的控制点容器std::vector<double> U_aft(C_aft.size() + Sp1.k + 1);	//插入后的节点容器//为节点赋值for (int i = 0; i <= k; i++) U_aft[i] = Sp1.U[i];	//插入点前面不受影响的部分for (int i = 1; i <= r; i++)  U_aft[k + i] = u;	for (int i = k + 1; i < U_num1; i++) U_aft[i + r] = Sp1.U[i];	//插入点后面不受影响的部分//为控制点赋值for (int i = 0; i <= k - Sp1.k; i++) {		//插入点前面不受影响的部分C_aft[i] = Sp1.ControlPoint[i]; w_aft[i] = Sp1.w[i];}for (int i = k - s; i < Sp1.n; i++) {		//插入点后面不受影响的部分C_aft[i + r] = Sp1.ControlPoint[i];w_aft[i + r] = Sp1.w[i];}//新生成的控制点赋初值std::vector<POINT> C_tem(Sp1.k - s + 1);for (int i = 0; i <= Sp1.k - s; i++) {C_tem[i] = Sp1.ControlPoint[k - Sp1.k + i];w_tem[i] = Sp1.w[k - Sp1.k + i];}//插入r次int L;for (int j = 1; j <= r; j++) {L = k - Sp1.k + j;	//此次插入位置for (int i = 0; i <= Sp1.k - j - s; i++) {			//计算控制该段曲线的k+1个控制点double alpha = (u - Sp1.U[L + i]) / (Sp1.U[i + k + 1] - Sp1.U[L + i]);C_tem[i].x = alpha * C_tem[i + 1].x * w_tem[i + 1] + (1.0 - alpha) *     C_tem[i].x * w_tem[i];    //新的控制点xyz值C_tem[i].y = alpha * C_tem[i + 1].y * w_tem[i + 1] + (1.0 - alpha) * C_tem[i].y * w_tem[i];C_tem[i].z = alpha * C_tem[i + 1].z * w_tem[i + 1] + (1.0 - alpha) * C_tem[i].z * w_tem[i];w_tem[i] = alpha * w_tem[i + 1] + (1.0 - alpha) * w_tem[i];    //新的权值C_tem[i].x /= w_tem[i];    //将新的点除以新的权值C_tem[i].y /= w_tem[i];C_tem[i].z /= w_tem[i];}//重新计算的k+1个控制点中,首尾点不变C_aft[L] = C_tem[0];				C_aft[k + r - j - s] = C_tem[Sp1.k - j - s];w_aft[L] = w_tem[0];w_aft[k + r - j - s] = w_tem[Sp1.k - j - s];}//载入剩下的控制点和权值for (int i = L + 1; i < k - s; i++) {C_aft[i] = C_tem[i - L];w_aft[i] = w_tem[i - L];}//由新生成的点、权值、节点构建新的NURBS曲线NURBSpline Nt(C_num2, Sp1.k);Nt.ControlPoint = C_aft;Nt.U = U_aft;Nt.w = w_aft;return Nt;
}

4.补充

1)本篇文章的实例是向节点间插入新的节点,但实际上还可以向节点上插入重复的节点,如下图。此时可以观察到,同样向3次曲线插入了1个节点,这次却只有两个控制点改变,除首尾控制点外还有一个控制点没发生改变,这是因为重复插入节点时,有一个控制点在代入公式计算时,U_Bar和Ui相等了,从而得到结果α=0,使得该控制点未发生改变。


http://chatgpt.dhexx.cn/article/JFOIIcKf.shtml

相关文章

理解Nurbs曲线/曲面的参数空间

人们对计算几何最常见的误解之一与曲线参数有关。 由于 Nurbs 曲线的数学相当复杂——其中大部分肯定超出了高中水平——很难解释控制点坐标、控制点权重、曲线度数和结向量如何共同使 nurbs 曲线的参数化变得复杂。 我自己对 Nurbs 数学的掌握充其量是皮毛&#xff0c;所以我…

Bezier曲线、B样条和NURBS的基本概念

最不能理解的一点&#xff0c;一讨论软件的曲面&#xff0c;曲线功能&#xff0c;最后就变成曲线、曲面的数学原理的讨论了&#xff0c;但是里面也没数学好的&#xff0c;讨论的结果可想而知。 我不是数学家&#xff0c;我不懂这么复杂的方程&#xff0c;只要好用就行了。 在CA…

NURBS曲线 和 NURBS曲面

NURBS曲线 NURBS曲线&#xff08;非均匀有理B样条&#xff09;是由分段有理B样条多项式基函数定义的&#xff0c;k阶NURBS曲线的定义如下&#xff1a; P ( t ) ∑ i 0 n w i P i N i , k ( t ) ∑ i 0 n w i N i , k ( t ) ∑ i 0 n P i R i , k ( t ) P(t)\frac{\sum_{i…

非均匀有理B-样条(Non-Uniform Rational B-Splines, NURBS)基础知识

B样条是无理的&#xff0c;组成无理B样条曲线或曲面。有理曲线或曲面可以精确地表示圆锥截面。非均匀有理B样条(Non-Uniform Rational B-Splines, NURBS)就是为了表达更精确的曲面引入的&#xff0c;其控制顶点包含权重。NURBS的基函数与B样条不同&#xff0c;但结点向量、张量…

MATLAB实现NURBS逼近曲线拟合及界面

目录 前言 一、数据点参数化 1.1原因 1.2方法 1.3代码(封装到类) 二、节点矢量计算 2.1方法 2.2代码 三、最小二乘反算控制点 四、基函数实现 五、豪斯多夫距离 六、离散曲率 总结 前言 采用matlab实现NURBS逼近曲线的拟合&#xff0c;利用app designer实现拟合的界…

NURBS Curves

文章目录 1. 定义2. 性质2.1 NURBS基函数的性质2.2 NURBS曲线的性质 3. 修改权重4. 相关算法4.1 节点插入&#xff1a;单点插入4.2 De Boors Algorithm 5. Rational Bzier Curves6. Rational Bzier Curves: Conic Sections7. Circular Arcs and Circles 1. 定义 NURBS&#xff…

Matlab中安装NURBS工具箱及使用

文章目录 前言一、NURBS工具箱的安装1 打开matlab&#xff0c;点击附加功能2 输入nurbs3 下载后压缩包解压4 将解压后的文件夹放到matlab文件夹的toolbox文件夹里面5 选择“预设路径”上方的“预设” 二、NURBS工具箱的使用2.1 NURBS 结构&#xff1a;2.2 对NURBS工具箱的初步理…

计算几何07_NURBS曲线与曲面

B样条方法在表示与设计自由曲线曲面时展现出强大的威力&#xff0c;但在设计与表示初等曲线曲面时却遇到了麻烦。因为B样条曲线、及其特例的Bezier曲线都不能精确表示除抛物线以外的二次曲线弧&#xff0c;B样条曲面、及其特例的Bezier曲面都不能精确表示除抛物面以外的二次曲面…

利用NURBS曲线进行点云曲面拟合算法

文章目录 介绍NURBS曲线C实现思路代码实现读取点云数据对点云进行预处理创建曲面模型将曲面模型转换为NURBS曲面 完整代码opennurbs.h说明vs2019安装OpenNURBS库编译OpenNURBS库 介绍 点云拟合曲面算法是将点云数据拟合成一个二次或高次曲面模型的算法。这种算法主要用于三维模…

离散数据点NURBS曲线拟合算法

问题描述&#xff1a;对于离散数据点集来说&#xff0c;其主要特征点一般可以描述原始曲线轨迹的基本形状。对于大量的离散数据点来说&#xff0c;提取主要的特征点后在进行曲线拟合&#xff0c;这样可以降低计算次数&#xff0c;极高拟合效率。 可以描述原始曲线几何形状的 特…

Nurbs建模

多边形建模和Nurbs建模 Nurbs始终有四个侧面&#xff0c;由有理多项式方程创立的曲线&#xff0c;由控制点定义的曲线。 Nurbs曲线是由一系列多项式构成的&#xff1a;axb0,ax^2bxc0… 能够将任何平面转换为Nurbs NURBS能买构建几乎所有的形状

matlab中Nurbs库的简单使用

文章目录 前言一、简单例子二、复杂一点的NUrbs曲面nrbeval函数 前言 只是为方便学习&#xff0c;不做其他用途&#xff0c;记录matlab中Nurbs的使用&#xff0c;好像记得是添加的matlab中的一个Nurbs库来着。前一段使用&#xff0c;现在不记得了&#xff0c;使用这个程序得先安…

NURBS

非均匀有理样条NURBS( Non-Uniform Rational B-Splines ) 是近年来发展迅速&#xff0c;应用广泛的一种表示曲线曲面造型技术。它能够精确地表示二次规则曲线曲面&#xff0c;从而能用统一的数学形式表示规则曲面与自由曲面&#xff0c;具有可影响曲线曲面形状的权因子&#xf…

【Matlab-NURBS工具箱简要教程及实例 】

Matlab-NURBS工具箱使用教程 添加NURBS工具箱 在附加功能里添加NURBS工具箱 安装完成后可以在’函数’处查看API&#xff0c;也打开文件夹查看。 强烈推荐同步安装gnurbs工具&#xff0c;它完全代替nrbplot展示曲面&#xff0c;且允许用户进行节点拖拽等操作。 NURBS 结…

Nurbs曲线详解

NURBS&#xff08;Non Uniform Rational B-spline&#xff09;曲线通常称为非均匀有理B样条曲线&#xff0c;其数学定义如下&#xff1a; 基函数由递推公式定义&#xff1a; 非均匀&#xff1a;指节点向量的值与间距可以为任意值。这样我们可以在不同区间上得到不同的混合…

NURBS曲面结构及生成原理、修改方法

NURBS全称是Non-Uniform Rational B-Splines中文叫做非均匀有理B样条曲线&#xff0c;Rhinoceros中的模型曲线便是通过NRUBS曲线进行描述&#xff0c;曲面则是通过U和V两个方向的曲线集合来得到&#xff0c;如图&#xff1a; Rhino如何生产曲面原理 由上图我们发现就像织布一样…

MySQL数据库增量备份及恢复方案

MySQL数据库增量备份及恢复方案 u 前言 操作系统崩溃、电源故障、文件系统崩溃和硬件故障等异常状况都可能导致我们正在使用的数据库出现故障而产生数据库中数据不一致的情况。为了保证数据库使用安全&#xff0c;必须定期备份数据库&#xff1b;数据库备份可以分为&#xff1…

差异增量备份和累积增量备份区别(有图)

所谓增量备份&#xff0c;顾名思义即是每次备份仅操作那些发生了"变化"的数据块。RMAN中增量备份有两种&#xff1a;Differential 方式和Cumulative方式。 1、差异增量备份Differential 说起Differential&#xff0c;相当有意思&#xff0c;大家可以这样理解。有一…

数据库的备份与恢复(完全备份,增量备份)

目录 1. 数据库备份的分类1.1 从物理与逻辑的角度&#xff0c;备份可分为1.2 从数据库的备份策略角度&#xff0c;备份可分为 2. 常见的备份方法3. MySQL完全备份与分类3.1 完全备份概述3.2 备份方式3.2.1 物理冷备份及恢复3.2.2 使用专用备份工具 mysqldump3.2.2.1 备份库3.2.…

图解完全备份,增量备份,差异备份

因为网上说的全部都是copy的&#xff0c;所以自己去理解了一下然后整理了一下。 完全备份 完成备份我相信大家都理解&#xff0c;就是一下子备份所有的内容。 增量备份 如上图所示&#xff0c;比如一家公司&#xff0c;周一这家公司进行完全备份&#xff0c;然后周二备份周一…