B看條
佇數學的子學科數值分析內底,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 )