3.样条曲线之B样条曲线

article/2025/9/29 4:21:34

B样条曲线

        B样条是使用更广泛的逼近样条类。B样条有两个贝塞尔样条所不具备的优点:1、B样条多项式次数可独立于控制点数目(有一定限制);2、B样条允许局部控制曲线或曲面。缺点是B样条比贝塞尔样条更复杂。我们可以把沿B样条曲线的坐标位置的计算表示写成混合函数公式的表达式:
在这里插入图片描述
        B样条的局部控制可以由定义在u取值范围中子区间上的混合函数来实现。B样条曲线的混合函数由Cox-deBoor递归公式定义为
在这里插入图片描述
所选的一组子区间端点Uj称为节点(kont),而选定的一组之区间的端点整体称为节点向量(kont vector)。可以选择满足Uj=<Uj+1的任意值作为子区间端点。Umin和Umax的值取决于所选的控制点个数、参数d的取值、如何建立子区间(节点向量)。除了局部控制,B样条曲线允许通过改变控制点的个数来设计一条曲线,而不需要改变多项式的次数。也可以增加或修改控制点的数目来控制曲线形状。类似地,可以增加节点向量的值从而辅助曲线的设计。 B样条曲线具有以下性质:

  • 在u取值范围内,多项式曲线的次数为d-1,并且具有C^d-2连续性。
  • 对于n+1个控制点,曲线由n+1个混合函数进行描述。
  • 每个混合函数Bk,d定义在u取值范围的d子区间上,以节点向量之Uk为起点。
  • 参数u的取值范围由n+d+1个节点向量中指定的值分成n+d个子区间。
  • 节点值记为{U0,U1,…,Un+d},所生成的B样条曲线仅定义在从节点值Ud-1到节点值Un+1的区间上。
  • 每个样条曲线段(在两个相邻节点值间)受d个控制点影响。
  • 任意一个控制点可以影响最多d条曲线段的形状。
  • 对于从节点值Ud-1到Un+1区间上的任意值u,所有的基本函数之和为1:B0,d(u)+B1,d(u)+…+Bn,d(u) = 1。

给出控制点位置和参数d的值,则需要执行节点值,并使用Cox-deBoor递归关系来获得混合函数。节点向量有三种分类:均匀的、开放均匀的和非均匀的。

示例演示

        按照《计算机图形学(第四版)》的公式,写出了程序在均匀的 节点向量情况下总是不对。所以做点小改动。首先Cox-deBoor递归公式改为如下:
在这里插入图片描述
然后,u等于节点值Un+1时减去一个很小的值。

/**********************************************************************Copyright (c) Mr.Bin. All rights reserved.
For more information visit: http://blog.csdn.net/webzhuce**********************************************************************/
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkActor.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkProperty.h>
#include <vtkPoints.h>
#include <vtkSphereSource.h>
#include <vtkGlyph3DMapper.h>
#include "vtkBSplineSource.h"int main()
{double p0[3] = { -40.0, -40.0, 0.0 };double p1[3] = { -20.0, 200.0, 0.0 };double p2[3] = { 20.0, 200.0, 0.0 };double p3[3] = { 40.0, -40.0, 0.0 };vtkNew<vtkPoints> points;points->InsertNextPoint(p0);points->InsertNextPoint(p1);points->InsertNextPoint(p2);points->InsertNextPoint(p3);// spline pointsvtkNew<vtkSphereSource> spheresource;spheresource->SetPhiResolution(20);spheresource->SetThetaResolution(20);spheresource->SetRadius(10);spheresource->Update();vtkNew<vtkPolyData> ctrlpointsdata;ctrlpointsdata->SetPoints(points);vtkNew<vtkGlyph3DMapper> ctrlpointsmapper;ctrlpointsmapper->SetInputData(ctrlpointsdata);ctrlpointsmapper->SetSourceConnection(spheresource->GetOutputPort());ctrlpointsmapper->Update();vtkNew<vtkActor> ctrlpointsactor;ctrlpointsactor->SetMapper(ctrlpointsmapper);ctrlpointsactor->GetProperty()->SetColor(1.0, 0.0, 0.0);//splinevtkNew<vtkBSplineSource> spline;//open uniformint d = 4;std::vector<float> knots = { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f,1.0f,1.0f };open uniform//int d = 3;  //std::vector<float> knots = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};spline->SetParameters(points, d, knots);vtkNew<vtkPolyDataMapper> splinemapper;splinemapper->SetInputConnection(spline->GetOutputPort());vtkNew<vtkActor> splineactor;splineactor->SetMapper(splinemapper);splineactor->GetProperty()->SetColor(1.0, 0.0, 0.0);//rendervtkNew<vtkRenderer> renderer;renderer->AddActor(ctrlpointsactor);renderer->AddActor(splineactor);renderer->SetBackground(1.0, 1.0, 1.0);vtkNew<vtkRenderWindow> renderwindow;renderwindow->SetSize(400, 200);renderwindow->AddRenderer(renderer);vtkNew<vtkRenderWindowInteractor> interactor;interactor->SetRenderWindow(renderwindow);vtkNew<vtkInteractorStyleTrackballCamera> style;interactor->SetInteractorStyle(style);interactor->Initialize();interactor->Start();return EXIT_SUCCESS;}

运行结果

1、均匀的节点向量
在这里插入图片描述
2、开放均匀的节点向量
在这里插入图片描述


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

相关文章

曲线理论-详解Bezier曲线、B样条曲线、NURBS曲线

文章目录 曲线理论-详解Bezier曲线、B样条曲线、NURBS曲线样条曲线Bezier曲线&#xff0c;B样条曲线 &#xff0c;NURBS曲线Bezier曲线B样条曲线参考内容 曲线理论-详解Bezier曲线、B样条曲线、NURBS曲线 一直使用三维软件绘制曲线曲面&#xff0c;然而对曲线曲面的基本理论并…

样条曲线(参数曲线)曲率

曲率计算公式 设参数曲线C(u): C ( u ) ( x ( u ) , y ( y ) , z ( u ) ) C(u) (x(u),y(y),z(u)) C(u)(x(u),y(y),z(u)) 曲线曲率表达为&#xff1a; k ( u ) ∣ C ′ ( u ) C ′ ′ ( u ) ∣ ∣ C ′ ( u ) ∣ 3 ( 1 ) k(u)\frac{|C^{}(u)\times C^{}(u)|}{|C^{}(u)|^…

计算机图形学-样条曲线Spline

内容来自《计算机图形学》第四版 第14章-样条表示 目录 [1] 样条的种类1. 插值样条2. 逼近样条 [2] 参数连续性条件[2] 几何连续性条件[3] 样条描述1. 列出一组施加在样条上的边界条件2. 列出描述样条特征的行列式3. 列出一组混合函数或基函数 [4] 三次样条插值方法1. 自然三次…

样条曲线(spline)

文章目录 样条&#xff08;spline&#xff09;是什么&#xff1f;样条曲线的定义样条曲线的分类B-splineDefinitionPropertyB-spline vs. Bzier curveHow can we prove that a Bezier curve is a specific case of a B-spline curve by the definition of B-splines? Bzier sp…

样条曲线

基本概念 在计算机图形中&#xff0c;样条曲线&#xff08;spline curve&#xff09;指由多项式曲线段连接而成的曲线&#xff0c;在每段的边界处满足特定的连续性条件。样条曲面&#xff08;spline surface&#xff09;可以使用两组样条曲线进行描述。 给定一组称为控…

布丁压缩注册表删除路径

被布丁压缩的弹窗广告烦了好几天&#xff0c;卸载了好几次又自动安装了&#xff0c;今天终于忍无可忍&#xff0c;所以今天必须得跟它say Byebye&#xff01; winR快捷键&#xff0c;输入regedit&#xff0c;打开注册表 路径在这里 找注册表里的文件删除就ok 保险起见 在C:\Pr…

用注册表修改右键菜单

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 一&#xff1a; 开始&#xff0c;运行里面…

VMware卸载重装产生的注册表问题

http://www.xitongcheng.com/jiaocheng/dnrj_article_58655.htmlTOC 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 …

关于电脑注册表regedit自定义管理右键菜单选项实例(删除增加)

前言&#xff1a;删除电脑多余右键菜单的具体操作 所有关于电脑的操作都可以通过修改注册表来实现。而随着电脑软件的安装&#xff0c;本就为方便人们操作的右键菜单变的愈来愈臃肿。但我们可以自定义管理大多数右键菜单&#xff0c;这篇帖子就是为了解决这些问题 右键菜单管…

XP注册表文件存放位置

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! XP注册表文件存放位置%system%/system32/config目录下有这样一些文件sam.* Securi…

QTP操作注册表

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 在QTP中没有提供用于直接操作注册表的测试…

组策略对应注册表位置部分解读

一、概要 在域环境中&#xff0c;管理员经常要执行的操作就是编辑应用域策略&#xff0c;对域环境中成员主机进行集中管理&#xff0c;但是有时候会存在这样的问题&#xff0c;某项策略配置应用生效后&#xff0c;导致了域成员主机部分功能异常&#xff0c;但是直接撤销域策略…

“office安装过程错误,显示注册表某路径没有权限”解决办法

文章转自https://blog.csdn.net/super_star666/article/details/79962129 博主在安装office过程&#xff0c;因为重复卸载后&#xff0c;再安装就出现了问题。从网上搜了很多解决办法都无法实现。只有这种办法解决了问题。首先在这里感谢一下原作者&#xff0c;让我不至于再浪费…

梳理注册表的一些危险操作,注册表的安全配置,以及对于注册表的总结

本次文章为大家梳理一些注册表常见的危险操作&#xff0c;希望可以帮大家规避一些在日常使用中可能会遇到的问题。 映象劫持IFEO&#xff08;Image File Execution Options&#xff09; 在低版本的windows中&#xff0c;我们可以简单地替换程序&#xff0c;但是在高版本的win…

「事件驱动架构」Kafka中的模式注册表和模式演化

在这篇文章中&#xff0c;我们将通过Kafka模式注册表来研究Kafka中的模式演化和兼容性类型。通过对兼容性类型的良好理解&#xff0c;我们可以安全地随着时间的推移对模式进行更改&#xff0c;而不会无意中破坏生产者或消费者的利益。 数据集 在我们的“真实世界中的Hadoop开发…

IObit Uninstaller(电脑软件彻底卸载, 包含注册表) 彻底解决软件卸载不干净的问题

本文是众多使用技巧中其中的一篇, 全部使用技巧点击链接查看, 或直接查看本专栏其他文章, 保证你收获满满 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以去 我的主页 了解更多计算机学科的精品思维导图整理 本文可以转载&…

Windows注册表及常见子项

Windows注册表五大根键以及常用注册表项 注册表概述&#xff1a;注册表是Windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”&#xff0c;也可以说是一个非常巨大的树状分层结构的数据库系统。注册表记录了用户安装在计算机上的软件和每个程序…

注册表权限修改

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

webx框架解析

2019独角兽企业重金招聘Python工程师标准>>> WebX框架是阿里巴巴集团开发的&#xff0c;它建立在SpringEx的基础上&#xff0c;具有超强的扩展能力。 一、Webx的层次结构&#xff08;从里到外&#xff09; &#xff08;1&#xff09;SpringExt&#xff1a;基于Sprin…

Webx mvc 源码

Webx命名规范 Web请求响应 当Webx Framework接收到一个来自WEB的请求以后,实际上它主要做了两件事: 首先,它会增强request、response、session的功能,并把它们打包成更易使用的RequestContext对象。 其次,它会调用相应子应用的pipeline,用它来做进一步的处理。 假如在…