Bezier曲线与B-Spline曲线
微分幾何基礎
微分集合是用微分的方法來研究曲線的局部性質,如曲線的彎曲程度等。
一條可以用參數表示的三維曲線是一個有界點集,可以寫成一個帶參數的、連續的、單值的數學函數:
{x=x(t)y=y(t)z=z(t)0?t?1p=p(t)t∈[0,1]p′(t)=dpdtp′′(t)=d2pdt2\begin{aligned} &\begin{cases} x=x(t)\\ y=y(t)\\ z=z(t) \end{cases} 0\leqslant t\leqslant 1\\ &\quad p=p(t)\quad t\in[0,1]\\ &\quad p'(t)=\dfrac{{\rm d}p}{{\rm d}t}\\ &\quad p''(t)=\dfrac{{\rm d}^2p}{{\rm d}t^2} \end{aligned} ???????x=x(t)y=y(t)z=z(t)?0?t?1p=p(t)t∈[0,1]p′(t)=dtdp?p′′(t)=dt2d2p??
位置矢量
貝塞爾曲線
一階貝塞爾曲線P01P_0^1P01?由兩個控制點P0P_0P0?和P1P_1P1?完全定義,相當于線性插值。隨著ttt從0到1變化,貝塞爾點從P0P_0P0?移動到P1P_1P1?.
P01=(1?t)P0+tP1,t∈[0,1]P_{0}^{1}=\left( 1-t\right) P_{0}+tP_{1}\quad,t\in[0,1] P01?=(1?t)P0?+tP1?,t∈[0,1]
二階貝塞爾曲線由一階貝塞爾曲線遞歸定義。三個控制點P0P_0P0?、P1P_1P1?、P2P_2P2?,二階貝塞爾曲線的產生完全由這三個點的位置決定。
三個控制點每兩個相鄰的控制點產生一個一階貝塞爾點,兩個一階貝塞爾點,于是得到兩個點;
兩個點形成一個線段,這個線段上有一個點在運動,于是得到一個點;
P11=(1?t)P1+tP2P02=(1?t)P01+tP11=(1?t)[(1?t)P0+tP1]+t[(1?t)P1+tP2]=P0(1?t)2+2P1t(1?t)+P2t2\begin{aligned} P_{1}^{1}&=\left( 1-t\right) P_{1}+tP_{2}\\ P_{0}^{2}&=\left( 1-t\right) P_{0}^{1}+tP_{1}^{1}\\ &=\left( 1-t\right) \left[ \left( 1-t\right) P_{0}+tP_{1}\right] +t\left[ \left( 1-t\right) P_{1}+tP_{2}\right] \\ &=P_{0}\left( 1-t\right) ^{2}+2P_{1}t\left( 1-t\right) +P_{2}t^{2} \end{aligned} P11?P02??=(1?t)P1?+tP2?=(1?t)P01?+tP11?=(1?t)[(1?t)P0?+tP1?]+t[(1?t)P1?+tP2?]=P0?(1?t)2+2P1?t(1?t)+P2?t2?
三階貝塞爾曲線:
P03=P0(1?t)3+3P1t(1?t)+3P2t(1?t)+P2t3P_0^3=P_{0}\left( 1-t\right) ^{3}+3P_{1}t\left( 1-t\right) + 3P_{2}t\left( 1-t\right)+P_{2}t^{3} P03?=P0?(1?t)3+3P1?t(1?t)+3P2?t(1?t)+P2?t3
通用遞歸定義公式:
Pik={Pik=0(1?t)Pik?1+tPi+1k?1k?1P_{i}^{k}=\begin{cases} P_i&k=0\\ \left( 1-t\right) P_{i}^{k-1}+tP_{i+1}^{k-1}&k\geqslant1 \end{cases} Pik?={Pi?(1?t)Pik?1?+tPi+1k?1??k=0k?1?
總結規律可得n階貝塞爾曲線的公式為:
Pin=∑j=0nCnj(1?t)n?jtjPi+jt∈[0,1]P_{i}^{n}=\sum ^{n}_{j=0}C_{n}^{j}\left( 1-t\right) ^{n-j}t^{j}P_{i+j}\quad t\in[0,1] Pin?=j=0∑n?Cnj?(1?t)n?jtjPi+j?t∈[0,1]
使用數學歸納法證明:
假設n?kn\leqslant kn?k時如下等式成立
Pik=∑j=0kCkj(1?t)k?jtjPi+jP_{i}^{k}=\sum ^{k}_{j=0}C_{k}^{j}\left( 1-t\right) ^{k-j}t^{j}P_{i+j} Pik?=j=0∑k?Ckj?(1?t)k?jtjPi+j?
當n=k+1n=k+1n=k+1時,
Pik+1=(1?t)Pik+tPi+1k.=(1?t)∑j=0kCkj(1?t)k?jtjPi+j+t∑j=0kCkj(1?t)k?jtjPi+j+1=∑j=0kCkj(1?t)k?j+1tjPi+j+∑j=1k+1Ckj?1(1?t)k?j+1tjPi+j=(1?t)k+1+[∑j=1k(Ckj+Ckj?1)(1?t)k?j+1tjPi+j]+Ckktk+1\begin{aligned} P_{i}^{k+1}&=\left( 1-t\right) P_{i}^{k}+tP_{i+1}^{k}.\\ &=\left( 1-t\right) \sum ^{k}_{j=0}C_{k}^{j}\left( 1-t\right) ^{k-j}t^{j}P_{i+j}+t\sum ^{k}_{j=0}C_{k}^{j}\left( 1-t\right) ^{k-j}t^{j}P_{i+j+1}\\ &=\sum ^{k}_{j=0}C_{k}^{j}\left( 1-t\right) ^{k-j+1}t^{j}P_{i+j}+\sum ^{k+1}_{j=1}C_{k}^{j-1}\left( 1-t\right) ^{k-j+1}t^{j}P_{i+j} \\ &=\left( 1-t\right) ^{k+1}+\left[ \sum ^{k}_{j=1}\left( C_{k}^{j}+C_{k}^{j-1}\right) \left( 1-t\right) ^{k-j+1}t^{j}P_{i+j}\right] +C_{k}^{k}t^{k+1} \end{aligned} Pik+1??=(1?t)Pik?+tPi+1k?.=(1?t)j=0∑k?Ckj?(1?t)k?jtjPi+j?+tj=0∑k?Ckj?(1?t)k?jtjPi+j+1?=j=0∑k?Ckj?(1?t)k?j+1tjPi+j?+j=1∑k+1?Ckj?1?(1?t)k?j+1tjPi+j?=(1?t)k+1+[j=1∑k?(Ckj?+Ckj?1?)(1?t)k?j+1tjPi+j?]+Ckk?tk+1?
因為
Ck+1j=(k+1)!(k+1?j)!j!Ckj=k!(k?j)!j!Ckj?1=k!(k?j+1)!(j?1)!Ckj+Ckj?1=k!(k?j)!(j?1)!(1j+1k?j+1)=k!?(k+1)[(k?j)!?(k?j+1)]?[(j?1)!?j]=(k+1)!(k+1?j)!j!=Ck+1j\begin{aligned} C_{k+1}^{j}&=\dfrac{\left( k+1\right) !}{\left( k+1-j\right) !j!}\\ C_{k}^{j}&=\dfrac{k!}{\left( k-j\right) !j!} \\ C_{k}^{j-1}&=\dfrac{k!}{\left( k-j+1\right) !\left( j-1\right) !} \\ C_{k}^{j}+C_{k}^{j-1}&=\dfrac{k!}{\left( k-j\right) !\left( j-1\right) !}\left( \dfrac{1}{j}+\dfrac{1}{k-j+1}\right) \\ &=\dfrac{k!\cdot \left( k+1\right) }{\left[ \left( k-j\right) !\cdot \left( k-j+1\right) \right] \cdot \left[ \left( j-1\right) !\cdot j\right] }\\ &=\dfrac{\left( k+1\right) !}{\left( k+1-j\right) !j!}=C_{k+1}^{j} \end{aligned} Ck+1j?Ckj?Ckj?1?Ckj?+Ckj?1??=(k+1?j)!j!(k+1)!?=(k?j)!j!k!?=(k?j+1)!(j?1)!k!?=(k?j)!(j?1)!k!?(j1?+k?j+11?)=[(k?j)!?(k?j+1)]?[(j?1)!?j]k!?(k+1)?=(k+1?j)!j!(k+1)!?=Ck+1j??
所以
Pik+1=∑j=0k+1Ck+1j(1?t)k?j+1tjPi+jP_{i}^{k+1}=\sum ^{k+1}_{j=0} C_{k+1}^{j} \left( 1-t\right) ^{k-j+1}t^{j}P_{i+j} Pik+1?=j=0∑k+1?Ck+1j?(1?t)k?j+1tjPi+j?
貝塞爾曲線的性質:
∑j=0nCnj(1?t)n?jtj=(1?t+t)n=1\sum ^{n}_{j=0}C_{n}^{j}\left( 1-t\right) ^{n-j}t^{j}=(1-t + t)^n=1 j=0∑n?Cnj?(1?t)n?jtj=(1?t+t)n=1
由性質1可知貝塞爾曲線是控制點的凸組合,所以貝塞爾曲線始終包含在所有控制點組成的最小凸多邊形中。也就是可以通過控制點的凸包來限制規劃曲線的范圍,這在路徑規劃中是很好的一條性質。
第一個控制點和最后一個控制點,恰好是曲線的起始點和終止點。可以將t=1t=1t=1或000代入,除了起始點和終止點的其他控制點的系數都是0。
dPindt=d(1?t)ndtPi+∑j=1n?1CnjPi+j[(1?t)n?jdtjdt+d(1?t)n?jdttj]+dtndtPn=?n(1?t)n?1Pi+ntn?1Pi+n+∑j=1n?1CnjPi+j[j(1?t)n?jtj?1?(n?j)(1?t)n?j?1tj]\begin{aligned} \dfrac{{\rm d}P_{i}^{n}}{{\rm d}t}&=\dfrac{{\rm d}\left( 1-t\right) ^{n}}{{\rm d}t}P_{i}+\sum^{n-1}_{j=1}C_{n}^{j}P_{i+j}\left[ \left( 1-t\right) ^{n-j}\dfrac{{\rm d}t^{j}}{{\rm d}t}+\dfrac{{\rm d}\left( 1-t\right) ^{n-j}}{{\rm d}t}t^{j}\right] +\dfrac{{\rm d}t^{n}}{{\rm d}t}P_{n}\\ &=-n\left( 1-t\right) ^{n-1}P_{i}+nt^{n-1}P_{i+n}+\sum ^{n-1}_{j=1}C_{n}^{j}P_{i+j}\left[ j\left( 1-t\right) ^{n-j}t^{j-1}-\left( n-j\right) \left( 1-t\right) ^{n-j-1}t^{j}\right] \end{aligned} dtdPin???=dtd(1?t)n?Pi?+j=1∑n?1?Cnj?Pi+j?[(1?t)n?jdtdtj?+dtd(1?t)n?j?tj]+dtdtn?Pn?=?n(1?t)n?1Pi?+ntn?1Pi+n?+j=1∑n?1?Cnj?Pi+j?[j(1?t)n?jtj?1?(n?j)(1?t)n?j?1tj]?
dPindt∣t=0=?nPi+Cn1Pi+1=n(Pi+1?Pi)dPindt∣t=1=nPi+n?Cnn?1Pi+n?1=n(Pi+n?Pi+n?1)\begin{aligned} \dfrac{{\rm d}P_{i}^{n}}{{\rm d}t}| _{t=0}&=-nP_{i}+C_{n}^{1}P_{i+1}=n\left( P_{i+1}-P_{i}\right) \\ \dfrac{dP_i^{n}}{dt}| _{t=1}&=nP_{i+n}-C_{n}^{n-1}P_{i+n-1}=n\left( P_{i+n}-P_{i+n-1}\right) \end{aligned} dtdPin??∣t=0?dtdPin??∣t=1??=?nPi?+Cn1?Pi+1?=n(Pi+1??Pi?)=nPi+n??Cnn?1?Pi+n?1?=n(Pi+n??Pi+n?1?)?
分段貝塞爾曲線
雖然貝塞爾曲線的階數可以很高,但是如果曲線的階數過高,調整控制點對曲線的影響就比較小,調整起來相當麻煩。
于是,我們常常使用分段的貝塞爾曲線,保證每一小段不會太復雜。這樣每次只用調小段,還可以做到只調局部不影響大局,那就相當舒服了。
分段帶來的唯一問題是,曲線在段與段的交界處,如何保證平滑?
所謂平滑,其實就是一階導數連續,也就是左右導數的極限相同。
對兩側的貝塞爾曲線求導,分別代入 t=0 和 t=1 (即貝塞爾曲線的開始和結束時間),讓二者相等。此時能發現,當兩側控制點與分段交接點共線且形成的線段長度相等時,滿足曲線平滑性質。
參考資料
B樣條曲線
樣條曲線
設[a,b][a,b][a,b]為R\mathbb{R}R上的區間
樣條是通過一組指定點集而生成平滑曲線的柔性帶。 簡單地說,B 樣條曲線就是通過控制點局部控制形狀的曲線。
貝塞爾曲線有以下缺陷:
B樣條曲線除了保持Bezier曲線所具有的優點外,還彌補了上述所有的缺陷。
樣條曲線的次數是指在指定區間上是幾次多項式,階數是指樣條曲線有幾階連續導數。k階B樣條=關于u的k-1次曲線
設有P,P,P,…,P一共n+1個控制點,這些控制點用于定義樣條曲線的走向、界限范圍,則k階B樣條曲線的定義為:
P(u)=[P0P1?Pn][B0,k(u)B1,k(u)?Bn,k(u)]=∑i=0nPiBi,k(u)P(u)=\begin{bmatrix} P_0&P_1&\cdots&P_n\end{bmatrix} \begin{bmatrix} B_{0,k}(u)\\ B_{1,k}(u)\\ \vdots\\ B_{n,k}(u) \end{bmatrix}= \sum_{i=0}^n P_i B_{i,k}(u) P(u)=[P0??P1????Pn??]??????B0,k?(u)B1,k?(u)?Bn,k?(u)???????=i=0∑n?Pi?Bi,k?(u)
式中,Bi,k(u)B_{i,k}(u)Bi,k?(u)是第i個k階B樣條基函數,與控制點PiP_iPi?相對應,u是自變量。
基函數有如下德布爾-考克斯遞推式:
Bi.k(u)={{1,ui?u<ui+10,otherk=1u?uiui+k?1?uiBi,k?1(u)+ui+k?uui+k?ui+1Bi+1,k?1(u)k?2B_{i.k}(u)= \begin{cases} \begin{cases} 1,&u_i\leqslant u<u_{i+1}\\ 0,&\rm other \end{cases}&k=1 \\ \dfrac{u-u_i}{u_{i+k-1}-u_i}B_{i,k-1}(u)+\dfrac{u_{i+k}-u}{u_{i+k}-u_{i+1}}B_{i+1,k-1}(u)&k\geqslant 2 \end{cases} Bi.k?(u)=????????{1,0,?ui??u<ui+1?other?ui+k?1??ui?u?ui??Bi,k?1?(u)+ui+k??ui+1?ui+k??u?Bi+1,k?1?(u)?k=1k?2?
約定0/0=00/0=00/0=0,式中uiu_iui?是一組被稱為節點矢量的非遞減序列的連續變化值,首末值一般定義為0和1,該序列如下:
[u0,u1,?,uk,uk+1,?,un,un+1,?,un+k]\left[u_0,u_1,\cdots,u_k,u_{k+1},\cdots,u_n,u_{n+1},\cdots,u_{n+k}\right] [u0?,u1?,?,uk?,uk+1?,?,un?,un+1?,?,un+k?]
總結
以上是生活随笔為你收集整理的Bezier曲线与B-Spline曲线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android部分监听器使用方法总结(一
- 下一篇: GBDT-梯度提升决策树的一些思考