在Android開發(fā)中經(jīng)常會碰到自定義控件棒动。自定義控件涉及的內(nèi)容比較多糙申,如測量和繪制、事件分發(fā)的處理船惨、動畫效果的渲染與實現(xiàn)柜裸,當(dāng)然還有不得不提的貝賽爾曲線缕陕,相信很多小伙伴都知道貝塞爾曲線這個詞。但是疙挺,可能并不是每位小伙伴都清楚地知道扛邑,到底什么是貝塞爾曲線,又是什么特點讓它這么備受歡迎铐然。
貝賽爾曲線的前世今生:
貝塞爾曲線的數(shù)學(xué)基礎(chǔ)是早在 1912 年就廣為人知的[伯恩斯坦多項式蔬崩。直到1959年。當(dāng)時就職于雪鐵龍的法國數(shù)學(xué)家 Paul de Casteljau 開始對伯恩斯坦多項式進(jìn)行了圖形化的嘗試锦爵,并且提供了一種數(shù)值穩(wěn)定的德卡斯特里奧(de Casteljau) 算法舱殿。(多數(shù)理論公式是建立在大量且系統(tǒng)的數(shù)學(xué)建陌侣悖基礎(chǔ)之上研究的規(guī)律性成果)根據(jù)這個算法险掀,就可以實現(xiàn) 通過很少的控制點,去生成復(fù)雜的平滑曲線湾宙,也就是貝塞爾曲線樟氢。
但貝塞爾曲線的聲名大噪,不得不提到1962年就職于雷諾的法國工程師皮埃爾·貝塞爾(Pierre Bézier)侠鳄,他使用這種方法來輔助汽車的車體工業(yè)設(shè)計(最早計算機的誕生則是為了幫助美國海軍繪制彈道圖)埠啃,并且廣泛宣傳(典型的理論聯(lián)系實際并獲得成功的示例),因此大家稱為貝塞爾曲線伟恶。
貝賽爾曲線的數(shù)學(xué)理論:
貝賽爾曲線的本質(zhì)是通過數(shù)學(xué)計算公式去繪制平滑的曲線碴开,這些曲線是用一系列點來控制曲線狀態(tài)的,我們將這些點簡單分為兩類博秫,一類是數(shù)據(jù)點潦牛,一類是控制點。那么該如何求貝塞爾曲線上的點坐標(biāo)挡育?
一階貝賽爾:
可以看到一階貝賽爾是一條直線巴碗!對于一階貝塞爾曲線,我們可以通過幾何知識即寒,很容易根據(jù)
t的值得出線段上那個點的坐標(biāo):
二階貝賽爾:
1.步驟一:在平面內(nèi)選3個不同線的點并且依次用線段連接橡淆。如下所示..
2.步驟二:在AB和BC線段上找出點D和點E,使得 AD/AB = BE/BC
3.步驟三:連接DE母赵,在DE上尋找點F逸爵,F(xiàn)點需要滿足:DF/DE = AD/AB = BE/BC
4.步驟四:最最重要的!根據(jù)DE線段和計算公式找出所有的F點凹嘲,記住是所有的F點师倔,然后將其這些點連接起來。那施绎,連接規(guī)則是什么溯革?以上圖為例贞绳,第一個連接點是A-F,第二連接點是A-F1(這個F1必須滿足DF1/DE = AD/AB = BE/BC)以此類推致稀,直到最后連接上C點冈闭,下面上一個動圖加深理解:
可能有些小伙伴還是不理解,那么通過這個GIF其中的一張圖說明抖单,如下圖:
動圖里的P0萎攒、P1、P2分別代表的是上圖的:P0 == A矛绘;P1 == B耍休;P2 == C。那么這個黑色點货矮,代表的就是F點羊精,綠色線段的2個端點(P0-P1線段上的綠色點,代表是就是D點囚玫,P0-P2線段上的綠色點喧锦,代表是就是E點)。線段上面點的獲取抓督,必須要滿足等比關(guān)系燃少。
計算公式如下:
關(guān)于貝賽爾曲線的基本數(shù)學(xué)理論大概就是上面的內(nèi)容。兩個線段根據(jù)等比關(guān)系找點的貝塞爾曲線铃在,一般也稱為二階貝塞爾曲線阵具。
貝賽爾曲線的N階拓展(三階貝塞爾與N階貝塞爾曲線)
剛才說到,上面的貝賽爾曲線一般稱為二階貝塞爾曲線定铜,既然是二階貝塞爾曲線阳液,那肯定有三階貝塞爾曲線、四階貝賽爾曲線等等宿稀。其實三階貝塞爾與四階貝賽爾曲線以及N階貝賽爾曲線曲線的規(guī)則都是一樣的趁舀,都是先在線段上找點,這個點必須要滿足等比關(guān)系祝沸,然后依次連接矮烹,下面是三階貝賽爾曲線的解釋說明:
步驟一:三階貝賽爾曲線,簡單理解就是在平面內(nèi)選4個不同線的點并且依次用線段連接(也就是三條線)罩锐。如下所示
步驟二:同二階貝塞爾曲線一樣首先需要在線段上找對應(yīng)的點(E奉狈、F、G)涩惑,對應(yīng)的點必須要符合等比的計算規(guī)則仁期,計算規(guī)則如下:AE/AB = BF/BC = CG/CD;找到對應(yīng)的點以后接著依次鏈接EF、FG跛蛋;接著在EF熬的、FG線段上面繼續(xù)找點H、I赊级,對應(yīng)的點依舊要符合等比的計算規(guī)則押框,也就是 EH/EF = FI/FG;最后連接H理逊、I線段橡伞,在HI線段上面繼續(xù)找點J、點J的計算規(guī)則需要符合:EH/EF = FI/FG = HJ/HI
步驟三:重復(fù)步驟二的動作晋被,找到所有的J點兑徘,依次將J點連接起來,這樣最終完成了三階貝賽爾曲線羡洛。
整一個三階貝賽爾曲線的動作加起來就是下面的一張動圖:
計算公式如下:
那么四階貝賽爾曲線的實現(xiàn)步驟也是一樣的挂脑,平面上先選取5個點(5點4線)、依次選點(滿足等比關(guān)系)翘县、依次連接最域、根據(jù)計算規(guī)則找到所有的點(逐個連接)。锈麸。。牺蹄。忘伞。。
五階貝賽爾曲線:
n階貝賽爾曲線計算公式如下:
關(guān)于貝塞爾曲線沙兰,就講到這里氓奈,通過這篇文章,相信小伙伴們應(yīng)該都知道貝塞爾曲線是怎么繪制出來的鼎天。
參考:http://www.reibang.com/p/0c9b4b681724
作者:Alan
原創(chuàng)博客舀奶,請注明轉(zhuǎn)載處....