【数学与算法】贝塞尔(Bézier)曲线
這篇文章詳細(xì)的介紹了貝塞爾(Bezier)曲線,點擊跳轉(zhuǎn):【怎么理解貝塞爾曲線?】。
原文內(nèi)容很多很詳細(xì),本文摘取了一部分,并對原文做了一定程度的更清晰的排版、說明和修改。
一階貝塞爾曲線:
對于一階貝塞爾曲線,從上圖我們可以看到,它是一條直線,通過幾何知識,很容易根據(jù)t\color{blue}tt 的值,得出線段上那個點的坐標(biāo):
B1(t)=P0+(P1?P0)t\color{blue}B_1(t)=P_0+(P_1-P_0)tB1?(t)=P0?+(P1??P0?)t
也可以變形為:
B1(t)=(1?t)P0+tP1,t∈[0,1]\color{blue}B_1(t)=(1-t)P_0+tP_1, t\in[0,1]B1?(t)=(1?t)P0?+tP1?,t∈[0,1]
一階貝塞爾曲線很好理解, 就是根據(jù) t\color{blue}tt 來的線性插值。P0\color{blue}P_0P0?表示的是一個向量[x,y]\color{blue} [x ,y][x,y], 其中x、y\color{blue}x、yx、y是分別按照這個公式來計算的。
二階貝塞爾曲線:
在平面內(nèi)任選 3 個不共線的點,依次用線段連接。在第一條線段上任選一個點D\color{blue} DD。計算該點到線段起點的距離 AD\color{blue}ADAD,與該線段總長 AB\color{blue}ABAB 的比例。
根據(jù)上一步得到的比例,從第二條線段上找出對應(yīng)的點 E,使得 AD:AB=BE:BC\color{blue}AD:AB = BE:BCAD:AB=BE:BC。
這時候DE\color{blue}DEDE又是一條直線了, 就可以按照一階的貝塞爾方程來進(jìn)行線性插值了,
t=AD:AB\color{blue}t= AD:ABt=AD:AB
這時候就可以推出公式了.
P0′=(1?t)P0+tP1\color{blue}P_0'=(1-t)P_0+tP_1P0′?=(1?t)P0?+tP1? 對應(yīng)著上圖綠色線段的左端點,P0′\color{blue}P_0'P0′? 點是 P0P1\color{blue}P_0P_1P0?P1?線段上的線性插值結(jié)果。
P1′=(1?t)P1+tP2\color{blue}P_1'=(1-t)P_1+tP_2P1′?=(1?t)P1?+tP2? 對應(yīng)著上圖綠色線段的右端點,P1′\color{blue}P_1'P1′? 點是 P1P2\color{blue}P_1P_2P1?P2?線段上的線性插值結(jié)果。
B2(t)=(1?t)P0′+tP1′=(1?t)((1?t)P0+tP1)+t((1?t)P1+tP2)=(1?t)2P0+2t(1?t)P1+t2P2\color{blue} \begin{aligned} B_2(t)&=(1-t)P_0'+tP_1' \\ \\&=(1-t)((1-t)P_0+tP_1)+t((1-t)P_1+tP_2) \\\\ &=(1-t)^2P_0+2t(1-t)P_1+t^2P_2 \end{aligned} B2?(t)?=(1?t)P0′?+tP1′?=(1?t)((1?t)P0?+tP1?)+t((1?t)P1?+tP2?)=(1?t)2P0?+2t(1?t)P1?+t2P2??
整理一下公式, 得到二階貝塞爾公式:
B2(t)=(1?t)2P0+2t(1?t)P1+t2P2,t∈[0,1]\color{blue}B_2(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2, t\in[0,1]B2?(t)=(1?t)2P0?+2t(1?t)P1?+t2P2?,t∈[0,1]
二階貝塞爾曲線對應(yīng)著新構(gòu)造的綠色線段的一階貝塞爾曲線(線性插值)。P0、P1、P2\color{blue}P_0、P_1、P_2P0?、P1?、P2? 這三個點是固定不變的點,但是這個綠色曲線是會隨著 t\color{blue}tt 變化而變化的。
由P0、P1、P2\color{blue}P_0、P_1、P_2P0?、P1?、P2?這三個點,進(jìn)行二階貝塞爾曲線擬合,得到的曲線是圖中的紅色曲線:
- 從 t=0\color{blue}t=0t=0開始,B2(t)=P0\color{blue}B_2(t)=P_0B2?(t)=P0?,因此,起點和 P0\color{blue}P_0P0? 點重合;
- 0<t<1\color{blue}0<t<10<t<1時,曲線點就是圖中紅色線;
- 到 t=1\color{blue}t=1t=1終止,B2(t)=P2\color{blue}B_2(t)=P_2B2?(t)=P2?,因此,終點和 P2\color{blue}P_2P2? 點重合;
下面是我的總結(jié):
點擊跳轉(zhuǎn)【貝塞爾曲線動態(tài)圖展示】直觀理解貝塞爾曲線。
假如你有5個點P0、P1、P2、P3、P4\color{red}P_0、P_1、P_2、P_3、P_4P0?、P1?、P2?、P3?、P4?,想根據(jù)這5個點擬合出一條曲線,那么,如果使用貝賽爾曲線的話,擬合的效果就如上圖最后一個所示,最后一個圖是4次貝塞爾曲線。4次貝塞爾曲線的控制點就是這五個點,其他點不是4次貝塞爾曲線控制點,叫做中間點,確切的說,是遞歸需要用到的其他低階次的控制點。
通過上面圖,可以看出,最終的(紅色)曲線,就是對這幾個點進(jìn)行擬合得到的貝塞爾曲線。
n\color{blue}nn個控制點對應(yīng)著n-1\color{blue}n-1n-1階的貝塞爾曲線。
高階的貝塞爾可以通過不停的遞歸直到一階:
- 4次貝塞爾曲線需要【遞歸】用到3次貝塞爾曲線;
- 3次貝塞爾曲線需要【遞歸】用到2次貝塞爾曲線;
- 2次貝塞爾曲線需要【遞歸】用到1次貝塞爾曲線;
- 1次貝塞爾曲線就是
線性插值,就是上面動圖中的第一個圖。
貝塞爾曲線的性質(zhì):
- 階次是控制點個數(shù)減1。它限定了,給你n個點,你如果要使用貝塞爾曲線,那么只能使用n-1次貝塞爾曲線來擬合,這個限制條件不太友好;
- 牽一發(fā)動全身,移動一個控制點,整段曲線都會變化。
貝塞爾曲線的凸包性質(zhì)
貝塞爾曲線始終會在包含了所有控制點的最小凸多邊形中, 不是按照控制點的順序圍成的最小多邊形。這點大家一定注意. 這一點的是很關(guān)鍵的,也就是說可以通過控制點的凸包來限制規(guī)劃曲線的范圍,在路徑規(guī)劃是很需要的一個性質(zhì).
凸包可以理解為,有一堆點集,使用一個橡皮筋來套住所有點,最后橡皮筋圍成的形狀,就是這些點集的凸包。上面最后一個圖的5個點中,其實最后一個點P4不是在凸多邊形上,而是在這些點組成的凸包內(nèi)部。
用不嚴(yán)謹(jǐn)?shù)脑拋碇v,給定二維平面上的點集,凸包就是將最外層的點連接起來構(gòu)成的凸多邊形,它能包含點集中所有的點。
總結(jié)
以上是生活随笔為你收集整理的【数学与算法】贝塞尔(Bézier)曲线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Convolution(2021牛客暑期
- 下一篇: E. Mocha and Stars(莫