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

2024-04-12 06:36

本文主要是介绍三次 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;
endi = 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+1dem(:,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

这篇关于三次 Bspline(B样条曲线) NURBS曲线的绘制 matlab的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896373

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

轨迹规划-B样条

B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。 同时B样条分为准均匀和非均匀,以下为准均匀为例。 参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhuanlan.zhihu.com/p/50626506 参考链接2: https://zhuanlan.zhihu.com/p/536470972h

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr