三次 Bspline(B样条曲线) NURBS曲线的绘制 matlab

先来了解几个概念:

1.1 节点向量:

B-Spline需要定义曲线的节点向量U,它可以对应到Bezier曲线的参数u

其元素个数 (m+1) 和曲线阶数 、控制点个数n满足:m+1=k+1+n+1

如果U的每段的距离是相等,那么这个B-Spline就被称为均匀B样条,即:

如果U向量中存在k个相等的元素  ,则 B-spline 具有 k 的重复度;

1.2 权因子:

2 NURBS的计算公式

  • NU-nouniform,即非均匀,指有效节点向量区间距离非减不相等的。
  • R-rational,有理,指权值(weight)各不相等。 权值代表各控制点对某一个拟合点的影响力,这里也可以发现普通的样条来说,各控制点对于同一个拟合点的影响力是相等的。
  • BS-BSpline,B样条

一条k次NURBS曲线可以表示为一分段有理多项式矢函数,具有如下形式:

式中:

常取两端节点的重复度为k+1,在很多实际应用中,端节点值常取 0、1。

为了在方便进行MATLAB计算和编程,将推导实践中较为常用的三次NURBS曲线曲面的矩阵表达形式。

3 NURBS曲线的矩阵表达:


 

当k=3时,可以写出第 i 段 NURBS 曲线矩阵形式为:

式中:

3.1 权因子的选择与确定是一个至今尚未彻底解决的问题:

权因子对曲线的影响

3.2 节点矢量计算:

节点总数为:n+k+2,节点矢量的最大下标为:n+k+1

常取两端节点的重复度为k+1,若k=3,则左边k+1个0,右边k+1个1。

内节点的数目为n-k,因此曲线的段数为n-k+1;

如果已知型值点,即曲线上的点可以通过积累弦长、向心法进行节点矢量的计算,但是现在我们仅仅给定控制点和次数,根据这个来确定节点矢量有:

若是奇次,则为:

具体地,若k=3,则:

显然若k=3:

分母为n-k+1段三次曲线相应的控制多边形的总长度L;

u4为第一段三次曲线相应的控制多边形的长度之和/L;

u5为(第一段三次曲线相应的控制多边形的长度之和+第二段三次曲线相应的控制多边形的长度之和)/L;

......

u8为(第一段+第二段+第三段+......+第8-k段三次曲线相应的控制多边形的长度之和)/L;

clc
clear

% 选定控制点
P =[0,0;
    1,1;
    1.5,0.5;
    1.5,-0.5;
    1.25,0.3;
    1,0;
    1.25,-0.3;
    1,-1;];
[row,col] = size(P);
n = row - 1;
m = col;
% 权因子
w = [1;
     2;
     3;
     4;
     5;
     6;
     7;
     8;];
% 1.计算节点矢量
l = sqrt((P(1:end-1,1)-P(2:end,1)).^2+(P(1:end-1,2)-P(2:end,2)).^2);
L = l(1)+2*l(2)+3*sum(l(3:end-2))+2*l(end-1)+l(end);

k = 3;
U = zeros(n+k+2,1);
U(1:k+1) = 0;
U(end-(k):end) = 1;
lsumtemp = 0;
for ik = k+2:n+k+2-(k+1)
    ik1 = ik - (k+2) +1;
    lsumtemp = lsumtemp + l(ik1) + l(ik1+1) +l(ik1+2);
    U(ik) = lsumtemp/L;
end

i = 1:n-k+1;
detai_1_3(1,1,i) = U(i+1+3) - U(i+1);
detai_2_1(1,1,i) = U(i+2+1) - U(i+2);
detai_2_2(1,1,i) = U(i+2+2) - U(i+2);
detai_2_3(1,1,i) = U(i+2+3) - U(i+2);
detai_3_1(1,1,i) = U(i+3+1) - U(i+3);
detai_3_2(1,1,i) = U(i+3+2) - U(i+3);
detai_3_3(1,1,i) = U(i+3+3) - U(i+3);
m14(1,1,i) = 0; m24(1,1,i) = 0; m34(1,1,i) = 0;
m11(1,1,i) = detai_3_1.^2./(detai_2_2.*detai_1_3);
m13(1,1,i) = detai_2_1.^2./(detai_2_2.*detai_2_3);
m23(1,1,i) = 3*detai_3_1.*detai_2_1./(detai_2_2.*detai_2_3);
m33(1,1,i) = 3*detai_3_1.^2./(detai_2_2.*detai_2_3);
m44(1,1,i) = detai_3_1.^2./(detai_3_2.*detai_3_3);
m43(1,1,i) = -(m33(1,1,i)/3+m44(1,1,i)+detai_3_1.^2./(detai_3_2.*detai_2_3));

M1 = [m11,   1-m11-m13,m13,m14;
    -3*m11, 3*m11-m23,m23,m24;
     3*m11,-3*m11-m33,m33,m34;
    -m11, m11-m43-m44,m43,m44;];

t_p = linspace(0,1,100)';
T_p = [ones(length(t_p),1),t_p,t_p.^2,t_p.^3];
T = repmat(T_p,1,1,length(m11));

xo = P(:,1);
Dw_xt = [w(i).*xo(i),w(i+1).*xo(i+1),w(i+2).*xo(i+2),w(i+3).*xo(i+3)]';
yo = P(:,2);
Dw_yt = [w(i).*yo(i),w(i+1).*yo(i+1),w(i+2).*yo(i+2),w(i+3).*yo(i+3)]';
W_t = [w(i),w(i+1),w(i+2),w(i+3)]';
Dw_x = reshape(Dw_xt,4,1,5);
Dw_y = reshape(Dw_yt,4,1,5);
W = reshape(W_t,4,1,5);

for ink = 1:n-k+1
    dem(:,ink) = T(:,:,ink)*M1(:,:,ink)*W(:,:,ink);
    xp_i(:,ink) = T(:,:,ink)*M1(:,:,ink)*Dw_x(:,:,ink)./dem(:,ink);
    yp_i(:,ink) = T(:,:,ink)*M1(:,:,ink)*Dw_y(:,:,ink)./dem(:,ink);
end
xp = xp_i(:);
yp = yp_i(:);
C_u = [xp,yp];


figure(1)
plot(P(:,1),P(:,2),'--o')
hold on
plot(C_u(:,1),C_u(:,2))
axis equal

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535544.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊云的账单申诉

亚马逊云科技申诉通常涉及几个步骤,目的是解决账单错误或申请费用调整。以下是一个基本的指南,可以帮助你开始处理账单问题: 1. 审核账单 在开始申诉之前,首先登录到亚马逊云科技管理控制台。 导航到“账单仪表板”以查看当前的…

模型训练-保存训练数据

1.目的 找到一个可运行的代码,可以每个epoch打印训练数据,但是不会保存。因为在改进模型需要这些训练数据进行对比,所以需要将每个epoch的训练数据保存下来,写到一个文件中。 2.解决方案 直接问ChatGPT,提示词如下&…

AtCoder ABC248 A-D题解

比赛链接:ABC348 Problem A: 签到。 #include <bits/stdc.h> using namespace std; int main(){int N;cin>>N;for(int i1;i<N;i){if(i%30)cout<<x<<endl;elsecout<<o<<endl;}return 0; } Problem B: 枚举即可。 #include <bit…

51蓝桥杯之DS18B20

DS18B20 基础知识 代码流程实现 将官方提供例程文件添加到工程中 添加onewire.c文件到keil4里面 一些代码补充知识 代码 #include "reg52.h" #include "onewire.h" #include "absacc.h" unsigned char num[10]{0xc0,0xf9,0xa4,0xb0,0x99,…

【域适应】基于深度域适应MMD损失的典型四分类任务实现

关于 MMD &#xff08;maximum mean discrepancy&#xff09;是用来衡量两组数据分布之间相似度的度量。一般地&#xff0c;如果两组数据分布相似&#xff0c;那么MMD 损失就相对较小&#xff0c;说明两组数据/特征处于相似的特征空间中。基于这个想法&#xff0c;对于源域和目…

24/04/11总结

IO流(First edition): IO流&#xff1a;用于读入写出文件中的数据 流的方向&#xff08;输入指拿出来,输出指写进去) 输入流:读取 输出流:写出 操作文件类型 字节流:所有类型文件 字符流:纯文本 字节流: InputStream的子类:FileInputStream:操作本地文件的字节输入流 OutputSt…

工作流引擎常见API(以camunda为例)

在Camunda中&#xff0c;API的继承关系主要体现在各个服务接口之间。以下是Camunda中一些常见服务接口的继承关系&#xff1a; ProcessEngineServices 接口&#xff1a; RepositoryService&#xff1a; 负责管理流程定义和部署。RuntimeService&#xff1a; 负责管理流程实例的…

2023年通用人工智能AGI等级保护白皮书

今天分享的是人工智能专题系列深度研究报告&#xff1a;《人工智能专题&#xff1a;2023年通用人工智能AGI等级保护白皮书》。 通用人工智能发展现状 本章主要介绍通用人工智能的基本情况&#xff0c;包括其发展历史、现状以及组成架构等内容。本文还将通过从技术角度出发来分…

PTA 应急救援站选址(floyd+打印路径)

大学城虎溪社区有很多居民小区&#xff0c;居民小区道路图是连通的。现要在该社区新建一个应急救援站&#xff0c;且该应急救援站要和某个小区建在一起。为了使应急救援最快速&#xff0c;经各部门商量决定&#xff1a;应急救援站建好后&#xff0c;离应急救援站最远的小区到应…

大话设计模式之命令模式

命令模式是一种行为型设计模式&#xff0c;它将请求或操作封装成一个对象&#xff0c;从而允许客户端参数化操作。这意味着客户端将一个请求封装为一个对象&#xff0c;这样可以将请求的参数化、队列化和记录日志&#xff0c;以及支持可撤销的操作。 命令模式主要由以下几个角…

kaggle 泰坦尼克号1(根据男女性存活率)

kaggle竞赛 泰坦尼克号 流程 下载kaggle数据集导入所要使用的包引入kaggle的数据集csv文件查看数据集的大小和长度去除冗余数据建立特征工程导出结果csv文件 1.下载kaggle数据集 2.导入所要使用的包 import pandas as pd import numpy as np import matplotlib.pyplot as …

leetcode328.奇偶链表

1. 题目描述 在线练习 2. 解题思路 这道题&#xff0c;官方给的是中等难度。其实是一道基础题&#xff0c;大家应该都可以写得出来。 题目中给的示例可以清楚的看到&#xff0c;合并前后的奇偶链的各自包含的节点的顺序是不变的&#xff0c;我们基本可以确定使用尾插法来合并…

Ansys Mechanical | 软件介绍:业界一流的有限元求解器

Ansys Mechanical 有限元分析软件 Ansys Mechanical 是业界一流的有限元求解器&#xff0c;具有结构、热学、声学、瞬态和非线性功能&#xff0c;可帮助改进建模。 ​ 软件概览 Ansys Mechanical 创建了一个使用有限元仿真分析软件&#xff08;FEA&#xff09;进行结构分析…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP&#xff08;International Conference on Parallel Processing&#xff09;即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行&#xff01;ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…

欢迎加入PenPad Season 2 ,获得勋章以及海量 Scroll 生态权益

PenPad 是 Scroll 生态中的首个 LaunchPad 平台&#xff0c;该平台继承了 Scroll 生态的技术优势&#xff0c;具备包括隐私在内的系列特点&#xff0c;同时且也被认为是 Scroll 生态最重要的价值入口之一。Penpad 与 Scroll 官方始终保持着合作&#xff0c;同时该项目自启动以来…

你一定不能错过的多模态大模型!阿里千问开源Qwen-VL!具备图文解读等能力

1. Qwen-VL简介 1.1. 介绍 Qwen-VL的多语言视觉语言模型系列,基于Qwen-7B语言模型。该模型通过视觉编码器和位置感知的视觉语言适配器,赋予语言模型视觉理解能力。 Qwen-VL采用了三阶段的训练流程,并在多个视觉语言理解基准测试中取得了领先的成绩。该模型支持多语言、多图…

办公室电脑监控软件哪个最好用

办公室电脑监控软件哪个最好用 办公室监控软件主要用于帮助企业管理员监控员工在工作时间内的电脑使用情况&#xff0c;以提高工作效率、保障数据安全、遵守合规要求和维护良好的工作秩序。以下是一些推荐的办公室监控软件。 1、安企神 (1) 强大的监控功能&#xff1a;域智盾…

【文献分享】机器学习 + 分子动力学(LAMMPS 输入文件)+ 第一性原理 + 热学性质 + 动力学性质

分享一篇关于机器学习 分子动力学 第一性原理 热学性质 动力学性质的文章。 感谢论文的原作者&#xff01; 关键词&#xff1a; 1. Machine learning, 2. Deep potential, 3. Molecular dynamics 4. Molten salts 5. Thermophysical properties 6. Phase diagram 主…

并查集加训

1.模板 #include<iostream> using namespace std; const int N 1e4 10; int p[N]; int n, m;int fd(int x){if(x ! p[x]){p[x] fd(p[x]);}return p[x]; }int main(){scanf("%d%d", &n, &m);for(int i 1; i < n; i){p[i] i;}int z, x, y;while(…

nvm更新node版本

1、nvm安装和管理多个 Node.js 版本&#xff1a;NVM 允许用户在计算机上同时安装多个不同版本的 Node.js。这使得开发人员可以轻松地在不同的项目中使用不同的 Node.js 版本&#xff0c;而无需手动安装或卸载。 2、nvm切换 Node.js 版本&#xff1a;通过 NVM&#xff0c;用户可…