【数学与算法】贝塞尔曲线
這篇文章詳細的介紹了貝塞爾(Bezier)曲線,點擊跳轉:【怎么理解貝塞爾曲線?】。
原文內容很多很詳細,本文摘取了一部分,并對原文做了一定程度的更清晰的排版、說明和修改。
一階貝塞爾曲線:
對于一階貝塞爾曲線,從上圖我們可以看到,它是一條直線,通過幾何知識,很容易根據t\color{blue}tt 的值,得出線段上那個點的坐標:
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]
一階貝塞爾曲線很好理解, 就是根據 t\color{blue}tt 來的線性插值。P0\color{blue}P_0P0?表示的是一個向量[x,y]\color{blue} [x ,y][x,y], 其中x、y\color{blue}x、yx、y是分別按照這個公式來計算的。
二階貝塞爾曲線:
在平面內任選 3 個不共線的點,依次用線段連接。在第一條線段上任選一個點D\color{blue} DD。計算該點到線段起點的距離 AD\color{blue}ADAD,與該線段總長 AB\color{blue}ABAB 的比例。
根據上一步得到的比例,從第二條線段上找出對應的點 E,使得 AD:AB=BE:BC\color{blue}AD:AB = BE:BCAD:AB=BE:BC。
這時候DE\color{blue}DEDE又是一條直線了, 就可以按照一階的貝塞爾方程來進行線性插值了,
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? 對應著上圖綠色線段的左端點,P0′\color{blue}P_0'P0′? 點是 P0P1\color{blue}P_0P_1P0?P1?線段上的線性插值結果。
P1′=(1?t)P1+tP2\color{blue}P_1'=(1-t)P_1+tP_2P1′?=(1?t)P1?+tP2? 對應著上圖綠色線段的右端點,P1′\color{blue}P_1'P1′? 點是 P1P2\color{blue}P_1P_2P1?P2?線段上的線性插值結果。
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]
二階貝塞爾曲線對應著新構造的綠色線段的一階貝塞爾曲線(線性插值)。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?這三個點,進行二階貝塞爾曲線擬合,得到的曲線是圖中的紅色曲線:
- 從 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? 點重合;
下面是我的總結:
點擊跳轉【貝塞爾曲線動態圖展示】直觀理解貝塞爾曲線。
假如你有5個點P0、P1、P2、P3、P4\color{red}P_0、P_1、P_2、P_3、P_4P0?、P1?、P2?、P3?、P4?,想根據這5個點擬合出一條曲線,那么,如果使用貝賽爾曲線的話,擬合的效果就如上圖最后一個所示,最后一個圖是4次貝塞爾曲線。4次貝塞爾曲線的控制點就是這五個點,其他點不是4次貝塞爾曲線控制點,叫做中間點,確切的說,是遞歸需要用到的其他低階次的控制點。
通過上面圖,可以看出,最終的(紅色)曲線,就是對這幾個點進行擬合得到的貝塞爾曲線。
n\color{blue}nn個控制點對應著n-1\color{blue}n-1n-1階的貝塞爾曲線。
高階的貝塞爾可以通過不停的遞歸直到一階:
- 4次貝塞爾曲線需要【遞歸】用到3次貝塞爾曲線;
- 3次貝塞爾曲線需要【遞歸】用到2次貝塞爾曲線;
- 2次貝塞爾曲線需要【遞歸】用到1次貝塞爾曲線;
- 1次貝塞爾曲線就是線性插值,就是上面動圖中的第一個圖。
貝塞爾曲線的性質:
貝塞爾曲線的凸包性質
貝塞爾曲線始終會在包含了所有控制點的最小凸多邊形中, 不是按照控制點的順序圍成的最小多邊形。這點大家一定注意. 這一點的是很關鍵的,也就是說可以通過控制點的凸包來限制規劃曲線的范圍,在路徑規劃是很需要的一個性質.
凸包可以理解為,有一堆點集,使用一個橡皮筋來套住所有點,最后橡皮筋圍成的形狀,就是這些點集的凸包。上面最后一個圖的5個點中,其實最后一個點P4不是在凸多邊形上,而是在這些點組成的凸包內部。
用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連接起來構成的凸多邊形,它能包含點集中所有的點。
總結
以上是生活随笔為你收集整理的【数学与算法】贝塞尔曲线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数学与算法】曲线上各点的曲率kappa
- 下一篇: 【数学与算法】【分段三次Hermite插