三次 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

相关文章

【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

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户