【canvas】一組點怎麼平滑地用曲線連線呢?

老姚發表於2019-12-27

給定一組點怎麼平滑地用曲線連線呢?

這兩天突然找到了一個解決方案,其實可以使用quadraticCurveTo。

二次貝塞爾曲線,就是通過一個控制點,在兩點之間連線一條曲線。

【canvas】一組點怎麼平滑地用曲線連線呢?

上圖中,紅色的點是控制點,給人感覺,連線兩綠色端點的曲線彷彿受到了紅色點的磁力吸引。

核心程式碼是:

context.moveTo(p1.x, p1.y)
context.quadraticCurveTo(control.x, control.y, p2.x, p2.y)
複製程式碼

點選檢視完整程式碼和效果

當然這個曲線是有公式描述的,不過,本文我們只用它的一個特點就夠了。

那就是控制點與端點連線是與曲線相切的。

【canvas】一組點怎麼平滑地用曲線連線呢?

巧妙的地方來了!因為是相切的,假如我在某條切線的延長線上隨便找一個點,再以此為控制點,連線第3個端點,會怎樣?

沒錯,將得到光滑曲線!

【canvas】一組點怎麼平滑地用曲線連線呢?

上圖中,兩個控制點關於公共端點是對稱的。當然隨便一點都是可以的。

兩個向量的中點公式是:

x = (x1 + x2) / 2

因此當給出端點和中點這三個點中的任意兩個時,很輕鬆求出另外一個。

現在,3個點連線解決了,那麼任意一組點都可以類似畫出一條平滑曲線了。

比如5個隨機位置的:

【canvas】一組點怎麼平滑地用曲線連線呢?

點選檢視完整程式碼和效果

感謝你看到這裡,希望有所幫助。

本文完。

一組點怎麼平滑地用曲線連線呢? - 老姚的回答 - 知乎 www.zhihu.com/question/53…



下面的內容是關於本系列的介紹。

2019年末,本人立了個flag,2020年要研究透canvas動畫技術。

【canvas】一組點怎麼平滑地用曲線連線呢?

(圖中二維碼是我的唯一微訊號,如有掘友想加的,麻煩備註下【掘金】哈。)

在這個系列,我想寫一些常見動畫知識,本文是第1篇,篇幅可能會長短不一。更多的請檢視我的個人主頁,或者《系列目錄》

因為篇幅問題,根據以往的經驗,贊數不會太多,畢竟大家都喜歡給那種短時間看不完的文章點贊。嗯,我好像也是這樣。^_^

其實寫文章,主要還是給自己看的,算是自我進步的一個見證吧。抱著這種心態也許能好些。

另外關於canvas技術,我目前完整看完了3本書。算是過了基礎一關。

1.《HTML5 Canvas核心技術》

2.《HTML5+JavaScript動畫基礎》

3.《WebGL程式設計指南》

本系列一些文章可能會參考裡面的知識體系,對於一些屬於領域共識知識,如有區域性雷同,只能說:“自己憑本事學來的,怎能算抄襲。。。”。

開玩笑了,想法來源能提一句還是要提一句的。特別喜歡《精英日課》文章裡的一段話:

【canvas】一組點怎麼平滑地用曲線連線呢?

至於文章內容,canvas的API,本系列可能不會準備逐條介紹了,還請初學的童鞋見諒哈。MDN都有的,挺詳細的。同時,文章中遇到的還是會簡單提下。主要核心是闡述一些技巧和原理層面的知識個人理解吧。另外也打算分析一些codepen上炫酷動畫的實現原理,如果有時間可能會分析幾個動畫引擎,當然都是2D的。

再次感謝你閱讀到這裡。下一篇文章見。

相關文章