B 样条曲线

2024-02-20 01:28
文章标签 曲线 样条

本文主要是介绍B 样条曲线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、B 样条曲线的定义和性质

p p p 次 B 样条曲线的定义为
C ( u ) = ∑ i = 0 n N i , p ( u ) P i , a ≤ u ≤ b (1) \pmb C(u)=\sum_{i=0}^nN_{i,p}(u)\pmb P_i,\quad a\leq u\leq b\tag{1} C(u)=i=0nNi,p(u)Pi,aub(1)

这里 P i \pmb P_i Pi 是曲线的控制点 { N i , p ( u ) } \{N_{i,p}(u)\} {Ni,p(u)} 是定义在非周期(并且非均匀)节点矢量
U = ( a , ⋯ , a ⏟ p + 1 , u p + 1 , ⋯ , u m − p − 1 , b , ⋯ , b ⏟ p + 1 ) U=\bigg(\underbrace{a,\cdots,a}_{p+1},u_{p+1},\cdots,u_{m-p-1},\underbrace{b,\cdots,b}_{p+1}\bigg) U=(p+1 a,,a,up+1,,ump1,p+1 b,,b)

(包含 m + 1 m+1 m+1 个节点)上的 p p p 次 B 样条基函数。除非特别声明,通常取 a = 0 , b = 1 a=0,b=1 a=0,b=1。由 P i \pmb P_i Pi 构成的多边形称为控制多边形

对于固定的 u u u 值,计算 B 样条曲线上的对应点需要三步:

  1. 找到 u u u 所在的节点区间;
  2. 计算非零的基函数;
  3. 将非零基函数的值与相应的控制点相乘,再求和。

例1. U = { 0 , 0 , 0 , 1 , 2 , 3 , 4 , 4 , 5 , 5 , 5 } , u = 5 2 , p = 2 \quad U=\{0,0,0,1,2,3,4,4,5,5,5\},\ \ u=\dfrac{5}{2},\ \ p=2 U={0,0,0,1,2,3,4,4,5,5,5},  u=25,  p=2
此时, u ∈ [ u 4 , u 5 ) u\in[u_4,u_5) u[u4,u5),则
N 2 , 2 ( 5 2 ) = 1 8 , N 3 , 2 ( 5 2 ) = 6 8 , N 4 , 2 ( 5 2 ) = 1 8 N_{2,2}\Big(\dfrac{5}{2}\Big)=\frac{1}{8},\quad N_{3,2}\Big(\dfrac{5}{2}\Big)=\frac{6}{8},\quad N_{4,2}\Big(\dfrac{5}{2}\Big)=\frac{1}{8} N2,2(25)=81,N3,2(25)=86,N4,2(25)=81

与相应的控制点相乘并求和得
C ( 5 2 ) = 1 8 P 2 + 6 8 P 3 + 1 8 P 4 \pmb C\Big(\dfrac{5}{2}\Big)=\frac{1}{8}\pmb P_2+\frac{6}{8}\pmb P_3+\frac{1}{8}\pmb P_4 C(25)=81P2+86P3+81P4

具体算法如下:

def CurvePoint(p, U, P, u):"""计算 B 样条曲线上的点:param p: 基函数次数:param U: 节点矢量:param P: 控制点:param u: 固定值:return: 固定值 u 在 B 样条曲线上的对应值"""span = FindSpan(p, u, U)N = BasisFuns(span, u, p, U)C = 0.0for i in range(p+1):C = C + N[i] * P[span - p + i]return C

二、B 样条曲线的导矢

C ( k ) ( u ) \pmb C^{(k)}(u) C(k)(u) 表示 C ( u ) \pmb C(u) C(u) k k k 阶导矢。对于固定的 u u u,我们可以通过计算基函数的 k k k 阶导数得到 C ( k ) ( u ) \pmb C^{(k)}(u) C(k)(u)。特别地,有
C ( k ) ( u ) = ∑ i = 0 n N i , p ( k ) ( u ) P i \pmb C^{(k)}(u)=\sum_{i=0}^nN_{i,p}^{(k)}(u)\pmb P_i C(k)(u)=i=0nNi,p(k)(u)Pi

例2. p = 2 , U = { 0 , 0 , 0 , 1 , 2 , 3 , 4 , 4 , 5 , 5 , 5 } , u = 5 2 \quad p=2,U=\{0,0,0,1,2,3,4,4,5,5,5\},u=\frac{5}{2} p=2,U={0,0,0,1,2,3,4,4,5,5,5},u=25
N 2 , 2 ′ ( 5 2 ) = 0 − 2 3 − 1 1 2 = − 1 2 N 3 , 2 ′ ( 5 2 ) = 2 3 − 1 1 2 − 2 4 − 2 1 2 = 0 N 4 , 2 ′ ( 5 2 ) = 2 4 − 2 1 2 − 0 = 1 2 \begin{aligned} &N^\prime_{2,2}\Big(\frac{5}{2}\Big)=0-\frac{2}{3-1}\frac{1}{2}=-\frac{1}{2}\\[2ex] &N^\prime_{3,2}\Big(\frac{5}{2}\Big)=\frac{2}{3-1}\frac{1}{2}-\frac{2}{4-2}\frac{1}{2}=0\\[2ex] &N^\prime_{4,2}\Big(\frac{5}{2}\Big)=\frac{2}{4-2}\frac{1}{2}-0=\frac{1}{2} \end{aligned} N2,2(25)=031221=21N3,2(25)=3122142221=0N4,2(25)=422210=21

于是有
C ′ ( 5 2 ) = − 1 2 P 2 + 1 2 P 4 \pmb C^\prime\Big(\frac{5}{2}\Big)=-\frac{1}{2}\pmb P_2+\frac{1}{2}\pmb P_4 C(25)=21P2+21P4

以下给出对于固定的 u u u,计算 B 样条曲线上对应的点及其直到 d d d 阶(包括 d d d 阶)导矢的算法。我们允许 d > p d>p d>p,虽然(对非有理曲线而言)这些导矢都为零;但是,这些导矢对有理曲线是必要的。算法的输入是 u , d u,d u,d 以及下面的一些数据定义的 B 样条曲线

n n n:控制点的最大下标(控制点的个数是 n + 1 n+1 n+1);
p p p:曲线的次数;
U U U:节点矢量;
P P P:控制点数组。

算法的输出是数组 CK

def CurveDerivsAlg(n, p, U, P, u, d):"""计算固定的 u 时 B 样条曲线上对应的点及其 d 阶导矢:param n: 控制点的最大下标(控制点的个数是 n+1):param p: 曲线的次数:param U: 节点矢量:param P: 控制点数组:param u: 固定点:param d: 导矢阶数:return: 数组 CK"""du = min(d, p)CK = np.zeros(d+1)for k in range(p+1, d+1):CK[k] = 0.0span = FindSpan(p, u, U)nders = DersBasisFuns(span, u, p, n, U)for k in range(du+1):CK[k] = 0.0for j in range(p+1):CK[k] = CK[k] + nders[k, j] * P[span-p+j]return CK

这篇关于B 样条曲线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

轨迹规划-B样条

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

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

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

Matlab中BaseZoom()函数实现曲线和图片的局部放大

BaseZoom工具下载链接: 链接:https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd=9dyl 提取码:9dyl 下载完之后将工具包放置合适的路径下,并在matlab中“设置路径”中添加相应的路径; 注:可以先运行如下图片中的语句,看看是否报错;如果报如下错误,说明matlab未安装“Image Processing Toolbox”工

基于yolov8的包装盒纸板破损缺陷测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的包装盒纸板破损缺陷检测系统是一种高效、智能的解决方案,旨在提高生产线上包装盒纸板的质量检测效率与准确性。该系统利用YOLOv8这一前沿的深度学习模型,通过其强大的目标检测能力,能够实时识别并标记出包装盒纸板上的各种破损缺陷,如划痕、撕裂、孔洞等。 在系统中,首先需对包含破损缺陷的包装盒纸板图像进行数据采集和标注,形成训练数据集。随后,利用这些数据进行模型训练,使

基于yolov8的NEU-DET钢材缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的NEU-DET钢材缺陷检测系统是一种创新的解决方案,旨在通过深度学习技术实现对钢材表面缺陷的自动检测和识别。该系统利用YOLOv8算法,该算法以其高效、准确和实时检测的特点著称。 NEU-DET数据集为该系统提供了丰富的训练资源,涵盖了热轧带钢的六种典型表面缺陷,包括轧制氧化皮、斑块、开裂、点蚀表面、内含物和划痕,每种缺陷均有大量样本,确保了模型的全面性和准确性

基于yolov8的电动车佩戴头盔检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的电动车佩戴头盔检测系统利用了YOLOv8这一先进的目标检测模型,旨在提高电动车骑行者的安全意识,减少因未佩戴头盔而导致的交通事故风险。YOLOv8作为YOLO系列的最新版本,在检测速度和精度上均进行了优化,特别适用于处理复杂场景中的小目标检测。 该系统通过收集并标注包含电动车骑行者图像的数据集,对YOLOv8模型进行训练,使其能够准确识别骑行者是否佩戴头盔。在实

基于yolov8的西红柿缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的西红柿缺陷检测系统是一个利用深度学习技术的创新项目,旨在通过自动化和智能化的方式提高西红柿缺陷检测的准确性和效率。该系统利用YOLOv8目标检测算法,该算法以其高效性和准确性在目标检测领域表现出色。YOLOv8不仅继承了YOLO系列模型的优势,还引入了新的骨干网络、Anchor-Free检测头以及优化后的损失函数,这些改进使得模型在复杂环境下的检测性能更加优越。

基于yolov5的西红柿成熟度检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的西红柿成熟度检测系统是一个利用先进深度学习技术的创新项目,旨在提高西红柿成熟度检测的准确性和效率。该系统以YOLOv5为核心算法,该算法由Ultralytics公司于2020年发布,并在YOLOv3的基础上进行了显著改进。YOLOv5以其高效性和准确性在实时目标检测领域备受关注,特别适用于农业视觉检测任务。 该系统通过收集并预处理大量不同成熟度的西红柿图像数据,

vs2022 如何去掉 错误|警告的波形曲线 绿色波浪线

如图: 去不去都一样,只是看着不舒服,相当不爽 工具→选项→文本编辑器→显示错误波形曲线,把前的√去掉,按确定 清爽多了,虽然没啥卵用 。。。

基于yolov8的水面垃圾水面漂浮物检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的水面垃圾与漂浮物检测系统是一种高效、智能的监测解决方案。该系统利用YOLOv8这一前沿的深度学习模型,结合智能视频分析技术,对河道、湖泊等水面的垃圾漂浮物进行实时监测与识别。 YOLOv8作为YOLO系列的最新迭代,以其高准确度和实时检测能力著称。通过复杂的网络架构、优化的训练流程和强大的特征提取能力,YOLOv8能够在各种光照和水质条件下,准确识别包括生活垃圾