貝塞爾曲線的由來
- 皮埃爾·貝塞爾1962年在設計汽車外形時發明了貝塞爾曲線,目前被廣泛的運用在汽車流線設計和計算機圖形領域
- 貝塞爾曲線包括起點,終點和控制點。
一階貝塞爾曲線
沒有控制點,只是簡單的經過時間t, 從P0點移動到P1點
公式:
二階貝塞爾曲線
控制點為P1, 根據兩個綠點作出一條線段,然后確定貝塞爾曲線的點。比如t= 0.5時,左邊的綠點在P0-P1的中點,右邊的綠點在P1-P2的中點,兩個綠點連線,再取中點,即黑點,就是此時貝塞爾曲線的點的位置。t= 0.86時,也是同理,綠點的連線取0.86的位置。如下圖。黑點的軌跡就是貝塞爾曲線。
公式:
同理,
三階貝塞爾曲線示例
t = 0.46時,各個點都取所在線段的0.46的位置,最后的點,即黑點的運動軌跡,就是貝塞爾曲線。
公式:
通用公式
從三階貝塞爾的示例不難得出,黑點的位置是根據藍點的位置確定的,而藍點的位置是根據綠點的位置確定的。綠點的運動軌跡是一階貝塞爾函數,藍點是二階貝塞爾函數,黑點是三階貝塞爾函數。所以要求黑點的位置,需要求上一級的點的位置,依次遞歸。所以通用的求點的位置的公式如下
公式所表達的就是遞歸的思路:
在安卓中應用的例子
QQ 消息氣泡拖拽
翻書效果
點贊的飄心動畫
安卓的貝塞爾曲線API
安卓開發中,二階和三階貝塞爾函數就夠用了,API 如下
上一組和下組功能是一樣的,一般就用上一組的方式來實現。
quadTo示例
代碼示例
cubicTo示例
代碼示例
可以看出,函數調用比較簡單,就是計算點麻煩些,不同的效果需要用不同的控制點。而且,可以看出二階貝塞爾函數實現的是V型曲線,而三階貝塞爾函數可以實現V型,S型,繩結型等更不規則的曲線。
再來分析下貝塞爾在安卓中的常見應用場景
加入購物車
可以看出是V型曲線,可以用quadTo實現
QQ 消息氣泡拖拽
拉伸后的氣泡分析
上圖由兩個圓,以及兩條貝塞爾曲線組成。V型曲線,可以通過quadTo實現。
還是算各個點比較麻煩。。。
加載動畫
三個圓的運動軌跡為S型,三階貝塞爾曲線,可以用cubicTo實現
翻書效果
翻起的書角的兩側分別為V型曲線, 分別用二階貝塞爾實現即可。
點贊的飄心動畫
點贊后,心形圖案按照S型曲線上升,可以用三階貝塞爾實現
總結
貝塞爾曲線就是通過數據點和控制點來實現各種曲線效果
以上是個人學習貝塞爾函數的總結,參考了很多文章,感謝各位作者大大:
在線編輯貝塞爾曲線
Loading Balls
怎么理解貝塞爾曲線?
Android -- 貝塞爾二階實現餓了么加入購物車效果
Finding a Point on a Bézier Curve: De Casteljau's Algorithm
Path中的貝塞爾曲線
安卓自定義View進階-Path之貝塞爾曲線
Custom views in android using canvas api
Andorid 翻書效果
android實現QQ未讀消息拖拽動態效果