首页 > 其他分享 >B-spline (2)

B-spline (2)

时间:2024-01-29 17:47:02浏览次数:27  
标签:space Bezier Curve BS array spline

1.Non-uniform B-spline

上一篇中的B-spline是均匀的uniform,因为每一段Bezier Curve的traverse time都是一样的。那么non-uniform B-spline就是Bezier Curve的traverse time不一样,即表现为knot vector相邻元素之间的差不是1了。例如上一篇中例子的knot vector={0,0,0,0,1,2,3,3,3,3},如果knot vector变成{0,0,0,0,0.5,2,3,3,3,3},这就是non-uniform B-spline了。三段Bezier Curve的traverse time分别为[0, 0.5], [0.5, 2], [2, 3]。此时的基函数如下图(右)所示。

B-spline的对比如下图所示。

2.B-spline极坐标表达

下图所示为两条Bezier Curve的极坐标表达,第一条$t\in[a,b]$,第二条$t\in[b,c]$。那么两条Bezier Curve达到$C^0$连续的条件为: $$A[b,b,b]=B[b,b,b]\space\space\space(1)$$

进一步地,如下图所示,达到$C^1$连续的条件为: $$ \begin{array}{l} A[a,b,b]=B[b,b,a]\\ A[c,b,b]=B[b,b,c] \end{array}\space\space\space(2) $$

 

再进一步,如下图所示,达到$C^2$连续的条件为: $$ A[a,b,c]=B[a,b,c]\space\space\space(3) $$

至此,上方B-spline的5个控制点的极坐标为: $$ \begin{array}{l} BS[a,a,a]\\BS[a,a,b]\\BS[a,b,c]\\ BS[b,c,c]\\BS[c,c,c] \end{array}\space\space\space(4) $$

则对应的极坐标下的knot vector为:$V=\left \{a,a,a,b,c,c,c\right \}$。

那么,对于由N条k阶的Bezier Curve组成的k阶B-spline,其控制点极坐标为: $$ \begin{array}{l} BS[u_0,u_0,...u_0](k个)\\ BS[u_0,u_0,...u_1]\\ ...\\ BS[u_N,u_N,...u_N](k个) \end{array}\space\space\space(5) $$

对应的knot vector是:

3.de Boor Algorithm

通过B-spline控制点找到对应的Bezier Curve的控制点,然后分段画Bezier Curve。以下图为例,一条由6个控制点控制的3阶B-spline。那么可知它是由3条3阶的Bezier Curve组成的。

那么通过如下计算,就能获得3条Bezier Curve的控制点了。

$$ \begin{array}{l} BS(0,1,1)=\frac{BS(0,0,1)+BS(0,1,2)}{2}\\ BS(1,1,2)=\frac{2BS(0,1,2)+BS(1,2,3)}{3}\\ BS(1,2,2)=\frac{BS(0,1,2)+2BS(1,2,3)}{3}\\ BS(2,2,3)=\frac{BS(1,2,3)+BS(2,3,3)}{2}\\ BS(1,1,1)=\frac{BS(0,1,1)+BS(1,1,2)}{2}\\ BS(2,2,2)=\frac{BS(1,2,2)+BS(2,2,3)}{2} \end{array}\space\space\space(6) $$

然后画出整条B-spline,如下图所示。

这种方法还可以通过极坐标找到B-spline上指定点。

 相关代码参见:https://github.com/Larissa1990/bezier_and_bspline_generator

Refs:

https://en.wikiversity.org/wiki/CAGD/B-splines#Polar_Form_of_B-spline_Points

标签:space,Bezier,Curve,BS,array,spline
From: https://www.cnblogs.com/larissa-0464/p/17992318

相关文章

  • B-spline (1)
    1.什么是B-splineBezierCurve的缺点主要是:nonlocality,移动一个控制点会影响整条曲线高阶曲线,曲线离控制点很远对此,可以把N条BezierCurve组合起来。如下图所示,是两条3次BezierCurve在D点连接而得。此时,该曲线是一条$C^0$曲线,共有7个控制点。若想得到一条$C^1$曲线,则需要......
  • 样条曲线 spline curves
        所谓样条曲线是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面。    样条曲线是经过一系列给定点的光滑曲线。最初,样条曲线都是借助于物理样......
  • 安装torch_scatter,torch-sparse,torch-cluster,torch-spline-conv,torch-geometric
    1.查询torch版本号进入https://pytorch-geometric.com/whl/找到对应的torch版本>>点击进入   2.找到匹配的包  点击下载即可 3.使用pip离线安装pip......
  • cube spline---三次样条插值
    插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。与拟合不用经过每个已知点不同,插值需要经过每个已知点,另外并不是阶......
  • spline-spark-agent收集Iceberg(Spark程序)血缘
    一、背景使用Spark操作Iceberg(HiveCataLog的方式),使用Spline-Agent收集Spark作业的血缘。二、编译1、下载源码包:https://github.com/AbsaOSS/spline-spark-agent.git......
  • 【OpenGL】自己实现B-Spline曲线
    【OpenGL】自己实现B-Spline曲线​​1.绘制目标​​​​2.核心代码​​​​3.运行结果​​1.绘制目标自己实现B-Spline曲线。2.核心代码/TODO//////基于CdM公式计算B-Splin......
  • IfcBSplineSurfaceForm
    IfcBSplineSurfaceForm类型定义IfcBSplineSurfaceForm表示某个特定形状的曲面的一部分。 注:定义符合ISO/CD10303-42:1992此类型用于指示B样条曲线曲面表示某种特定......
  • IfcBSplineCurveForm
    IfcBSplineCurveForm类型定义IfcBSplineCurveForm表示某些特定形式的曲线的一部分。 注:定义符合ISO/CD10303-42:1992此类型用于指示B样条曲线代表某种特定形式的曲......