天天看點

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

貝塞爾曲線在計算機圖形學中被大量使用,通常可以産生平滑的曲線。如果您曾經使用過Photoshop,則可能會發現名為“錨點”的工具,您可以在其中放置錨點并用它們繪制一些曲線,這些也是貝塞爾曲線。如果您使用了基于矢量的圖形SVG,這些也會使用貝塞爾曲線。讓我們看看它是如何工作的。

定義

給定n + 1 個點(P0,…,Pn)稱為控制點,這些點定義的貝塞爾曲線定義為:

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

eq. 1

其中B(t)稱為Bernstein多項式:

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

eq. 2

你會注意到這個伯恩斯坦多項式看起來很像牛頓二項式公式中的第k項,也就是:

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

eq. 3

事實上,伯恩斯坦多項式就是(t + (1 - t))^n = 1的展開式中的第k項。這就是為什麼如果你把所有的Bi加到n,你會得到1。

二次貝塞爾曲線

二次貝塞爾曲線就是我們所說的有三個控制點的貝塞爾曲線,P(t)的階數是2。讓我們計算給定3個控制點的貝塞爾曲線,并探索一些我們可能會發現的特性!請記住,公式1适用于n+1個點,是以在我們的例子中n=2。

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

eq. 4

請注意,P(t)傳回的不是一個數字,而是曲線上的一個點。現在我們隻需要選擇三個控制點,然後在[0,1]範圍内對曲線求值。我們可以在Python中很容易地做到這一點。

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例
python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

您會注意到曲線從第一個控制點處開始,到最後一個控制點處結束。這個結果對任意數量的點都成立。由于t的取值範圍是從0到1,我們可以通過求P(t)在t=0和t=1時的值來證明這一點。使用eq.1:

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

eq. 5

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

eq. 6

因為是從P0到P2,P1完全決定了曲線的形狀。移動P1你可能會注意到:

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

貝塞爾曲線總是包含在控制點形成的多邊形中。這個多邊形是以被稱為控制多邊形,或者貝塞爾多邊形。這個屬性也适用于任意數量的控制點,這使得它們在使用軟體時的操作非常直覺。

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

控制多邊形還具有以下特性:包含曲線的面積最小,稱為凸包。

插補

貝塞爾曲線的一個有趣應用是繪制一條通過一組預定義點的平滑曲線。之是以有趣,是因為P(t)的公式産生點,并且不是y = f(x)的形式,是以一個x可以具有多個y。例如,我們可以這樣畫:

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

下面是如何使用公式1為任意數量的控制點編寫通用版本的Bezier曲線。

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例

運作該Python程式,顯示如下:

python如何畫貝塞爾曲線_了解貝塞爾曲線的數學和Python實作示例