幽星隨想

貝茲曲線

這篇是上週 1/17 凌晨看偷肉將的圖奇台的話題。

在向量繪圖中,我們常常想要畫出一條比較複雜的曲線,但又難以確切的表示曲線上每一個點的位置。這時可以先抓出曲線的轉折點,再把這些點以適當的方式,平滑的連在一起,就會得到我們想要的曲線了。

貝茲曲線就是這樣一種方法,它可以讓我們描繪出各種曲線。藉由調整節點的位置,也可以改變曲線每個部份的彎曲程度。因此我們可以利用貝茲曲線描繪出圖形的邊界,再分離曲線外部與內部,就能有去背的效果。這讓我們能進一步對背景和主體圖像做出相互獨立的操作,例如在主體上加上一些效果,而不會相互干擾。

貝茲曲線的公式

我聽了之後,對貝茲曲線確切是怎麼來的感到好奇,便到維基百科上面找到了他的公式:

BP0P1Pn(t)=(1t)BP0P1Pn1(t)+tBP1Pn(t)

我讀到這東西的時候大概是凌晨四點左右 — 我已經不知道到底是凌晨四點在圖奇聊貝茲曲線的主播比較怪,還是真的認真在聽還去翻維基百科的我比較瘋了 — 所以我只想說嗯好,他是一個遞迴式,然後

但是我當時的精神狀態真的不足以再繼續理解下去,所以我就去睡了。

搞懂公式

隔天(more like 幾個小時後)起來我又看了幾遍那個式子,但是我越看越覺得它怎麼好像有點似曾相識,於是我把兩個點的版本寫出來看,它長得像這樣:

(1t)P0+tP1

對照一下 P0P1,他就是這條線段上的某個點 Q :如果從 P1 等速跑到 P0 需要 1 秒鐘,而 t 秒鐘時跑到 Q 點, 那上面那條其實就代表了 Q 點的位置。

等等,不對阿,所以說那個遞迴公式不就是把兩段上面都做一樣的事,然後畫出一條軌跡?就是如果有三個人,他們等速跑完各自的全程都只要 1 秒鐘:

最後這個人的軌跡就是接出來的貝茲曲線了阿。要是有更多節點的時候,一樣直接一層一層往下接就可以了。

我還以為會用到微積分咧,2ㄏ — 不對,是物理過程把微積分的部份蓋掉了而已。如果不是直線的話,光算那個速度就會用到微積分了。嗯,至少我看懂它在幹嘛了。

雖然其實據說實際上根本沒人用到超過三層的,因為程式會跑不動,而且實際上還要再改一下算法讓他快一點,也是滿合理的啦。