Android貝塞爾曲線的理解與應用

在線計算貝塞爾曲線

貝塞爾曲線的由來

  • 皮埃爾·貝塞爾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未讀消息拖拽動態效果

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容