[TOC]
# 動畫原理
## 貝塞爾曲線
Bézier curve (貝塞爾曲線) 是應用于二維圖形應用程序的[數學曲線](http://baike.baidu.com/view/627248.htm)。?
曲線定義:起始點、終止點(也稱錨點)、控制點。通過調整控制點,貝塞爾曲線的形狀會發生化。?
1962 年,法國數學家 Pierre Bézier 第一個研究了這種矢量繪制曲線的方法,并給出了詳細的計算公式,因此按照這樣的公式繪制出來的曲線就用他的姓氏來命名,稱為**貝塞爾曲線**。
## 曲線階
曲線階的意思即曲線階次,每個樣條曲線都有階次,這是一個代表定義曲線的多項式階次的數學概念。階次通常比樣條段中的點數小 1。因此,樣條線的點數不得少于階次。
## 示例
<iframe class="code-result__iframe" data-trusted="1" style="width:344px;height:370px;border:1px #ccc solid" src="https://zh.js.cx/article/bezier-curve/demo.svg?p=0,0,1,0.5,0,1,0.5,0&animate=1"></iframe>
# 總結
貝塞爾曲線由其控制點定義。
貝塞爾曲線的兩種定義方法:
1. 使用數學方程式。
2. 使用繪圖過程:德卡斯特里奧算法
貝塞爾曲線的優點:
* 我們可以通過控制點移動來用鼠標繪制平滑線條。
* 復雜的形狀可以由多條貝塞爾曲線組成。
用途:
* 在計算機圖形學,建模,矢量圖形編輯器中。字體由貝塞爾曲線描述。
* 在 Web 開發中 — 用于 Canvas 上的圖形和 SVG 格式。順便說一下,上面的 “實時” 示例是用 SVG 編寫的。它們實際上是一個 SVG 文檔,被賦予不同的控制點做參數。你可以在單獨的窗口中打開它并查源碼:[demo.svg](https://zh.javascript.info/article/bezier-curve/demo.svg?p=0,0,1,0.5,0,0.5,1,1&animate=1)。
* 在 CSS 動畫中描述動畫的路徑和速度。
```
/**
* 三階貝塞爾曲線
* B(t) = P0 * (1-t)^3 + 3 * P1 * t * (1-t)^2 + 3 * P2 * t^2 * (1-t) + P3 * t^3, t ∈ [0,1]
*
* @param t 曲線長度比例
* @param p0 起始點
* @param p1 控制點1
* @param p2 控制點2
* @param p3 終止點
* @return t對應的點
*/
CalculateBezierPointForCubic : function ( t, p0, p1, p2, p3) {
var point = cc.p( 0, 0 );
var temp = 1 - t;
point.x = p0.x * temp * temp * temp + 3 * p1.x * t * temp * temp + 3 * p2.x * t * t * temp + p3.x * t * t * t;
point.y = p0.y * temp * temp * temp + 3 * p1.y * t * temp * temp + 3 * p2.y * t * t * temp + p3.y * t * t * t;
return point;
},
```
# 參考
[貝塞爾曲線 總結](http://www.360doc.com/content/14/0730/15/13193477_398140518.shtml)
[https://zh.javascript.info/bezier-curve](https://zh.javascript.info/bezier-curve)
- 修仙之路
- 基礎原理篇
- JS和Node.js事件環機制剖析
- 一圖理解原型鏈
- 手寫篇
- 基礎手寫
- 手寫實現 Promise A+ 類庫
- 手寫 CommonJS
- 手寫 Express 框架
- 手寫 React Router 4.0
- 手寫虛擬 DOM 和 DOM-Diff
- 手寫 Webpack 實現
- 手寫一個 MVVM 類庫
- 手寫一個 Vue-cli 腳手架
- 手寫 JWT 類庫
- 手寫 Mobx 類庫
- 手寫前端性能和錯誤監控框架
- 手寫 Vue 路由
- 手寫 Vuex 實現
- 手寫 redux 狀態容器
- 手寫 throttle 和 debounce
- Node 高級
- Mongodb
- 安全測試篇
- CSRF原理實現
- XSS原理實現
- 九種跨域方法全解析
- 編寫單元測試
- 爬蟲篇
- 使用puppeteer破解滑動驗證碼
- 工程篇
- 使用AST語法樹手工轉譯ES6代碼
- 編寫自己的webpack插件
- 實戰篇
- webpack4.0 實戰
- Canvas+Websocket 實現彈幕
- canvas 動效
- SVG 動效
- CSS3 實現 Apple Watch 中的呼吸燈效果
- CSS3 實現動態氣泡屏保效果
- 算法篇
- 基礎知識
- 服務器端
- 分布式架構中的冪等性
- TCP/UDP
- Docker
- V8
- 動畫篇
- 貝塞爾曲線
- requestAnimationFrame
- 框架篇
- 隨記