跳至內容

B看條

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

佇數學的子學科數值分析內底,B-看條是按呢條曲線一種特殊的表示形式。伊是 B-樣條基曲線的線性組合。B-平條是貝茲曲線的一種一般化,會當進一步來推廣做非均勻有理 B 看條(NURBS), 予阮會當予閣較濟一般的幾何體建造精確的模型。

De Boor 算法是一个數值上穩定的計算 B 平條的方法。

術語 _ B 看條 _ 是 Isaac Jacob Schoenberg 創造的,B 嘿基(basis)條路的縮略。

定義

予定 _ m _ + 一个較節點 _ t _ i,分布佇咧 [零 , 一] 區間,滿足


$ t _ { 零 } < t _ { 一 } < \ ldots < t _ { m } $

一个 _ n _ 次B 看條是一个參數曲線:


$ \ mathbf { S } : [零 , 一] \ to \ mathbb { R } ^ { 二 } $

伊由 _ n _ 次B 看條基 ( basis B-spline )組成


$ \ mathbf { S } ( t )=\ sum _ { i=零 } ^ { m } \ mathbf { P } _ { i } b _ { i , n } ( t ) { \ mbox { , } } t \ in [零 , 一] $ .

Pi 這號做控制點抑是de Boor 點. _ m _ + 一个 _ n _ 次 B 平條基會當用Cox-de Boor 遞歸公式定義


$ b _ { j , 零 } ( t ) :=\ left \ { { \ begin { matrix } 一 & \ mathrm { } \ quad t _ { j } < t < t _ { j + 一 } \ \ 零 & \ mathrm { . . . } \ end { matrix } } \ right . $


$ b _ { j , n } ( t ) :={ \ frac { t-t _ { j } } { t _ { j + n }-t _ { j } } } b _ { j , n 影一 } ( t ) + { \ frac { t _ { j + n + 一 }-t } { t _ { j + n + 一 }-t _ { j + 一 } } } b _ { j + 一 , n 影一 } ( t ) . $

當節點等距離,稱 B 看仿的齊勻( uniform ) 抑無來做非均勻( non-uniform )。

齊勻 B 形條曲線

當 B 條是齊勻的時陣,對於予定的 _ n _,彼每一个 B 條基是其他基的平移複製作爾。一个會當做替代的非遞歸定義是


$ b _ { j , n } ( t ) :=b _ { n } ( t + n-j ) \ qquad { \ mbox { , } } j=影一 , \ ldots m + 一 $

滿足


$ b _ { n } ( t ) :=( m + 一 ) \ sum _ { i=零 } ^ { m + 一 } \ omega _ { i } ( t _ { i }-t ) _ { + } ^ { m } \ qquad { \ mbox { , } } t \ in [零 , 一] $

滿足


$ \ omega _ { i } :=\ prod _ { j=零 , i \ neq j } ^ { m + 一 } { \ frac { 一 } { t _ { i }-t _ { k } } } $

其中


$ ( t _ { i }-t ) _ { + } $

是斷冪函數(truncated power function)

註解

當節點數佮濟項式次數相等的時陣,B 樣條退化為彼个貝茲曲線。即函數的形狀由節點的位來決定。縮放抑是平移節點向量袂改變基函數。

逐條包含佇咧伊的控制點的噗仔內底

_ n _ 次 B 平條的一个基


$ b _ { i , n } ( t ) $

只做在區間 [_ t _ i , _ t _ i + n + 一] 上非零。就是講


$ b _ { i , n } ( t )=\ left \ { { \ begin { matrix } > 零 & \ mathrm { } \ quad t _ { i } \ leq t < t _ { i + n + 一 } \ \ 零 & \ mathrm { . . . } \ end { matrix } } \ right . $

嘛會使講,咱若操作咱一个控制點,阮干焦改變曲線佇局部的行為,毋是像 Bezier 曲線彼是全局行為。

常數 B 看條

常數 B 條條是上簡單的款條。只定義佇一个節點距離上,而且毋是節點的函數。伊只是無仝節點段(knot span)的指示函數。


$ b _ { j , 零 } ( t )=一 _ { [ t _ { j } , t _ { j + 一 } ) }=\ left \ { { \ begin { matrix } 一 & \ mathrm { } \ quad t _ { j } \ leq t < t _ { j + 一 } \ \ 零 & \ mathrm { . . . } \ end { matrix } } \ right . $

線性 B 看條

線性 B 形條定義佇兩个相鄰的節點段頂懸,佇咧節點連紲但是袂使微。


$ b _ { j , 一 } ( t )=\ left \ { { \ begin { matrix } { \ frac { t-t _ { j } } { t _ { j + 一 }-t _ { j } } } & \ mathrm { if } \ quad t _ { j } \ leq t < t _ { j + 一 } \ \ { \ frac { t _ { j + 二 }-t } { t _ { j + 二 }-t _ { j + 一 } } } & \ mathrm { } \ quad t _ { j + 一 } \ leq t < t _ { j + 二 } \ \ 零 & \ mathrm { . . . } \ end { matrix } } \ right . $

三改 B 看條

一个片斷去的 B 形條的表達式會當寫作:


$ S _ { i } ( t )=\ sum _ { k=零 } ^ { 三 } \ mathbf { P } _ { i ma三 + k } b _ { i ma三 + k , 三 } ( t ) \ qquad { \ mbox { , } } t \ in [零 , 一] $

其中Si 是第 _ i _ 個 B 平條片斷去 P 是一个控制點集,_ i _ 和 _ k _ 是局部控制點索引。控制點的集合會是 $ P _ { i } ^ { w }=( w _ { i } x _ { i } , w _ { i } y _ { i } , w _ { i } z _ { i } , w _ { i } ) $ 的集合,其中 $ w _ { i } $ 是比重,當伊增加時曲線會去予人搝向控制點 $ P _ { i } $,咧減點鐘是共曲線遠離該點。


片段的規个集合 _ m _ 抹二條曲線($ S _ { 三 } , S _ { 四 } , . . . , S _ { m } $)由 _ m _ + 一个控制點($ P _ { 零 } , P _ { 一 } , . . . , P _ { m } , m \ geq 三 $)定義,做為 _ t _ 上的一个 B 逐項攏會當定義為


$ S ( t )=\ sum _ { i=零 } ^ { m } \ mathbf { P } _ { i } b _ { i , } ( t ) $

其中 _ i _ 是控制點數,_ t _ 是取節點值的全局參數。這个表達式共 B 條表示為 B 樣條基函數的線性組合,這嘛是這个名的原因。

有兩類 B 看條-齊勻佮非齊勻。非均勻 B 款條相鄰控制點間的距離無一定愛相等。一个一般的形式是區間綴著插入去控制點沓沓仔變小到零。


B 條條的程式指令

Matlab

InMatlab,the command「spline」can be used for spline interpolation .

( Note:In the command ,the cubic B-splineis used )


Cubic B-Spline Interpolation by Matlab

Generating a sine-like spline curve and samples it over a finer mesh :

x=零 : 一 : 十 ;   % original sampling points

y=sin ( x ) ;

xx=零 : 空七一 : 十 ;   % new sampling points

yy=spline ( x , y , xx ) ;

plot ( x , y ,'o', xx , yy )

Python

事前安裝模組

  • pip install numpy
  • pip install scipy
  • pip install matplotlib


Cubic B-Spline Interpolation by Python

from scipy . interpolate import interp 一 d

import matplotlib . pyplot as plt

import numpy as np

x=np . arange ( 零 , 十一 ) # original sample points , [零 , 一 , 二 ,…, 九 , 十]

y=np . sin ( x )

f=interp 一 d ( x , y , kind='cubic') ) # Cubic means the cubic B-spline .

x \ _ new=np . arange ( 零 , 十曉一 , 空七一 ) # new sample points , [零 , 空七一 , 空二二 ,…. . , 九九陽九 , 十]

y \ _ new=f ( x \ _ new )

plt . plot ( x , y ,'o', x \ _ new , y \ _ new )

plt . show ( )


B 平條曲面

B 逐个曲線佮曲面相關的算法

關於著這个所在牽連的算法,佇咧作中有針對 Bézier、B 看條(B-spline)猶閣有真齊勻有理 B 看條(Nurbs)的相關算法的詳細數學表達佮程序實現方法。

求導

佇幾何處理中,對參數曲線佮曲面的求導是上基本的運算之一,因為參數表達的特性,佇予定點的切線佮法線會當通過求導直接得著。 先來考察曲線的情形:採用本頁定義中的 B 逐條曲線表達式 $ \ mathbf { S } ( t )=\ sum _ { i=零 } ^ { m } \ mathbf { P } _ { i } b _ { i , n } ( t ) { \ mbox { , } } t \ in [零 , 一] $ 嘿參數 $ t $ 進行求導:$ { \ frac { d \ mathbf { S } } { dt } }=\ sum _ { i=零 } ^ { m } b'_ { i , n } ( t ) \ mathbf { P } _ { i } $

節點插入去刪除

曲線佮曲面擬合

應用

參看

  • 看條
  • De Boor 算法
  • 有理呢 B 看條

參考

本條目部份抑是全部內容出自以 GFDL 授權發佈的《自由線上電腦詞典》(FOLDOC)。

參考文獻

外部連結

  • Interactive java applets for B-splines
  • Introduction to Computing with Geometry Notes ( Dr . C .-K . Shene / Michigan Technological University )