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

相关文章

基于NURBS曲线的数据拟合算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1NURBS曲线基础 4.2 数据拟合原理 5.完整程序 1.程序功能描述        基于NURBS曲线的数据拟合算法,非均匀有理B样条(Non-Uniform Rational B-Splines,简称NURBS)曲线是一种强大的数学工具,广泛应用于计算机图形学、CAD/CA

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子,介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm=1001.2014.3001.5501文章浏览阅读323次,点赞4次,收藏2次。搞3D几何内核算法研究,必须学习NURBS样条曲线曲面。看《非均匀有理B样条 第2版》这本书,学习起来,事半功倍。在《插件化算法研究平台

Android自定义系列——8.Path之贝塞尔曲线

贝塞尔曲线能干什么 贝塞尔曲线作用十分广泛,简单举几个的栗子: QQ小红点拖拽效果一些炫酷的下拉刷新控件阅读软件的翻书效果一些平滑的折线图的制作很多炫酷的动画效果 理解贝塞尔曲线的原理 一阶曲线原理: 一阶曲线是没有控制点的,仅有两个数据点(A 和 B),最终动态过程如下: (本文中贝塞尔曲线相关的动态演示图片来自维基百科)。一阶曲线其实就是前面讲解过的lineTo。 二阶曲线

简单了解ESD模型与TLP曲线

上文讲了ESD和EOS的区别,说实话远不止那些。今日再稍加深入的介绍ESD。 一 ESD原理 ESD-Electro Static Discharge静电放电,具有不同静电电位的物体互相靠近或者直接接触引起的电荷转移。正常情况下,物体内部的正负电荷是相等的,对外表现不带电。当任何两种不同材质的物体接触后再分离就会产生静电。当正负电荷逐渐累计到一定程度时,将与周围环境产生电位差,从而使电荷经由放

HarmonyOS-MPChart根据y轴刻度绘制渐变色曲线

本文是基于鸿蒙三方库mpchart(OpenHarmony-SIG/ohos-MPChart)的使用,自定义绘制方法,绘制一条颜色渐变的曲线。 mpchart本身的绘制功能是不支持颜色渐变的曲线的,只支持渐变色填充大块颜色。那么当我们的需求曲线根据y轴的刻度发生变化,就需要自定义绘制方法了。 从图中我们可以看到,左边的y轴是一个从底部到顶部颜色渐变的直线,从绿色渐变到红色,而且数据曲线根据

三次插值曲线--插值技术

三次插值曲线 1.1.三次样条曲线 三次样条曲线的基本思想是,在给定的一系列点(称为控制点或数据点)之间,通过一系列三次多项式曲线段来拟合这些点,使得整个曲线既平滑又准确地通过所有控制点。 1.1.1.数学定义 给定一组点 ( P_0, P_1, …, P_n ),其中 ( P_i = (x_i, y_i) ),( x_0 < x_1 < … < x_n )。三次样条曲线由以下性质定义:

PCL 三次样条插值(二维点)

一、简介 在插值计算中,最简单的分段多项式近似应该是分段线性插值,它由连接一组数据点组成,仅仅只需要将这些点一一用直线进行顺序相连即可。不过线性函数插值的缺点也很明显,就是在两个子区间变化的比较突兀,也就是没有可微性(不够光滑)。因此我们需要更为符合物理情况的一种曲线,一般来讲,三次多项式包含四个常数,它可以确保插值函数不仅在区间上连续可微,而且具有连续的二阶导数,这样就可以达到我们想要节点处

B样条曲线曲面--拟合技术

B样条曲线曲面 1.B样条曲线 B样条曲线(B-spline curve)是一种在计算机图形学和计算几何中广泛使用的参数曲线。它是贝塞尔曲线(Bezier curve)的一种推广,提供了更好的局部控制能力。B样条曲线由一组控制点(也称为控制顶点)和一组基函数(称为B样条基函数)定义。 1.1.B样条曲线的定义 给定一组 ( n + 1 ) 个控制点 ( P i ) 和一组节点( k n

PullBezierZoomView 一个具有贝塞尔曲线下拉效果的自定义view

该控件效果基于PullZoomView源码改动的而来,感谢Frank-Zhu的开源代码.该控件具有下拉放大背景图和贝塞尔曲线的效果. github:https://github.com/X-FAN/PullBezierZoomView 欢迎star 我主要写了一个自定义的贝塞尔曲线的效果的控件并整合到了Frank-Zhu的项目中的一个子项中. 这里面有个小数学知识的求解,因为效果要贝赛尔曲线

Bezier曲线曲面--拟合技术

Bezier曲线曲面–拟合应用 1.Bezier曲线 1.1.Bezier曲线的定义 给定一组控制点 P_0, P_1, …, P_n,其中 n 是曲线的阶数,Bezier曲线的参数方程可以表示为: B ( t ) = ∑ i = 0 n P i b i , n ( t ) , t ∈ [ 0 , 1 ] B(t) = \sum_{i=0}^{n} P_i b_{i,n}(t), \qua