什麼?貝塞爾曲線竟然可以用來描摹心儀的小姐姐!

什麼是貝塞爾曲線?

​ 貝塞爾曲線於 1962 年,由法國工程師皮埃爾·貝濟埃(Pierre Bézier)所廣泛發表,他運用貝塞爾曲線來爲汽車的主體進行設計,貝塞爾曲線最初由保爾·德·卡斯特里奧於1959年運用德卡斯特里奧算法開發,以穩定數值的方法求出貝塞爾曲線。

​ 貝塞爾曲線具有很多特殊的性質,在一些領域比如圖形設計中應用十分廣泛,貝塞爾曲線完全由其控制點決定其形狀, n個控制點對應着n-1階的貝塞爾曲線,並且可以通過遞歸的方式來繪製。

一階曲線

在這裏插入圖片描述

一階曲線很好理解, 就是根據t來的線性插值. P0P_0表示的是一個向量(x,y)(x ,y), 其中xxyy是分別按照這個公式來計算的。
B1(t)=(1t)P0+tP1,t[0,1] B_{1}(t)=(1-t) P_{0}+t P_{1}, t \in[0,1]
可以看到,一階曲線是一條直線。

二階曲線

既然前面提到遞歸,那麼二階必然和一階有關係,

在這裏插入圖片描述

在平面上三個不共線的三點,依次用線段連接,分別取PaP_aPbP_b兩點,使得P0Pa:PaP1=P1Pb:PbP2=tP_0P_a:P_aP_1=P_1P_b:P_bP_2=t,此時PaPbP_aP_b又是一條直線,可以按照一階方式來插值了:
Pa=(1t)P0+tP1 P_a=(1-t) P_{0}+t P_{1}

Pb=(1t)P1+tP2 P_b=(1-t) P_{1}+t P_{2}

B2(t)=(1t)Pa+tPb=(1t)2P0+2t(1t)P1+t2P2,t[0,1] B_2(t)=(1-t) P_{a}+t P_{b}=(1-t)^{2} P_{0}+2 t(1-t) P_{1}+t^{2} P_{2}, t \in[0,1]

三階曲線

二階的貝塞爾通過在控制點之間再採點的方式實現降階, 每一次選點都是一次的降階,三階的也是同理:

在這裏插入圖片描述

這樣通過給定的離散點就能確定它們之間的插值曲線了。

鋼筆工具

貝塞爾曲線在圖形設計的應用中,最典型的就是Photoshop中的鋼筆工具。如下,中間一個節點,兩邊兩個手柄,調節手柄的方向可以控制曲線的走向,調節手柄的長度可以控制曲線的弧度,也就是調節tt的過程。

熟練運用之後就能繪製複雜的圖形,然後上色即可。

在這裏插入圖片描述

使用python繪製圖像

到這裏開始切入正題了,前面提到既然貝塞爾曲線可以通過公式表示,那麼一定可以通過python實現自動化操作。整體的思路就是給定一個位圖圖像,然後將其矢量化以保存矢量路徑,然後讀取路徑使用貝塞爾曲線勾勒填充就可以了。

位圖矢量化

位圖與矢量圖的一大區別就是位圖圖像進行處理,放大後會出現方塊狀,圖片屬於真彩色,圖片會失真。位圖圖像善於重現顏色的細微層次,能夠製作出色彩和亮度變化豐富的圖像,可逼真地再現這個世界,文件龐大,不能隨意縮放。矢量圖中保存的是線條和圖塊的信息,也就是所謂的路徑,在python中可以藉助Potrace模塊來完成矢量化的操作。

在這裏插入圖片描述

定義貝塞爾曲線

根據前面的知識定義貝塞爾曲線比較簡單,這裏使用粗暴的函數嵌套方式,感興趣的可以另外改善。

在這裏插入圖片描述

對於複雜的圖像我們一般使用三階以上的曲線描摹,需要定義類似於畫筆的操作,即繪製曲線至(x,y)點,

在這裏插入圖片描述

然後就是其他的線條操作。

繪圖

前面位圖中存取了路徑信息,我們只需要根據相應的路徑使用相應的繪製操作即可,如下

在這裏插入圖片描述

整個繪圖過程可以採用python中的turtle模塊,完成動畫,整個過程約二三十分鐘,一氣呵成,用來描摹心儀的小姐姐最合適不過~,下面放上小姐姐的照片,

在這裏插入圖片描述

然後經過簡單的剪輯配樂,就可以做成日常逗人開心的小視頻了,點擊下面鏈接即可觀看,

用python畫出南方菇涼~

代碼鏈接:draw-picture-with-turtle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章