貝茲曲線:修訂版本之間的差異

出自六年制學程
跳轉到: 導覽搜尋
二次貝茲曲線
 
(未顯示2位用戶所作出之95次版本)
第 1 行: 第 1 行:
[[分類:數學]][[分類:HTML]]
+
[[分類:數學]][[分類:SVG]]
 +
==一次貝茲曲線==
 +
<div style='float:right'><img src='https://upload.wikimedia.org/wikipedia/commons/0/00/B%C3%A9zier_1_big.gif'/></div>
 +
B(t)=P<sub>0</sub>+(P<sub>1</sub>-P<sub>0</sub>)t=(1-t)P<sub>0</sub>+tP<sub>1</sub>, t∈[0,1]
 +
 
 +
B(t)描述一條由P<sub>0</sub>至P<sub>1</sub>的直線。例如當t=0.25時,B(t)即一條由點P<sub>0</sub>至P<sub>1</sub>路徑的四分之一處。
 +
 
 +
等同於線性插值。
 +
 
 
==二次貝茲曲線==
 
==二次貝茲曲線==
 +
<table class='putInto' align=right>
 +
<tr><th><img src='https://upload.wikimedia.org/wikipedia/commons/6/6b/B%C3%A9zier_2_big.svg' width=240 height=100 /></th></tr>
 +
<tr><th>二次貝茲曲線的結構</th></tr>
 +
<tr><th><img src='https://upload.wikimedia.org/wikipedia/commons/3/3d/B%C3%A9zier_2_big.gif' width=240 height=100 /></th></tr>
 +
<tr><th>二次貝茲曲線演示<br/>t在[0,1]區間</th></tr>
 +
</table>
 +
重點:
 
#二次貝茲曲線畫出的是拋物線,無法畫出橢圓和雙曲線。故無法畫出正圓。
 
#二次貝茲曲線畫出的是拋物線,無法畫出橢圓和雙曲線。故無法畫出正圓。
#所有拋物線都「相似」(不是相等),且所有曲率(0~&infin;)的微線段都有。
+
#所有拋物線都「相似」(不是相等),且所有曲率(0~)的微線段都有。
 
#兩端點外只有一個控制點。
 
#兩端點外只有一個控制點。
 
#拋物線方程式 ax<sup>2</sup>+bxy+cy<sup>2</sup>+dx+ey+f=0 則 b<sup>2</sup> - 4ac=0 ,即前三項為完全平方式。
 
#拋物線方程式 ax<sup>2</sup>+bxy+cy<sup>2</sup>+dx+ey+f=0 則 b<sup>2</sup> - 4ac=0 ,即前三項為完全平方式。
===參考===
 
#[http://www.kut.com.tw/Upload//ProductProbation/File/數學高三甲上第二章第3節主題4觀念一.pdf 二元二次方程式圖形判別的例題]<br/>---------- 擬合圓 ----------
 
#[https://stackoverflow.com/questions/1734745/how-to-create-circle-with-b%c3%a9zier-curves/1734859 How to create circle with Bézier curves?]
 
#[https://oomake.com/question/343212 如何使用Bézier曲線創建圓?]
 
#[https://www.jianshu.com/p/5198d8aa80c1 用三阶贝塞尔曲线拟合圆]
 
  
===一、圖形最低點與控制點的關係===
+
===由二次貝茲曲線參數方程推導出四性質===
<table class=nicetable><tr>
+
#二次貝茲曲線圖形(以下簡稱圖形)是拋物線的一段。
<td>Q or q<br/>(quadratic<br/>Bézier<br/>curve)</td>
+
#t=<span style='font-stretch:condensed;'>½</span> 時弦與圖形垂直距離最大,圖形此處稱為頂點。
<td colspan=2>x1 y1 x y<br/><img src='http://jendo.org/wiki1231/images/a/a8/SvgPathQ.png' width='200px' height='*'/><br/><span style='font-size:90%'>&lt;path d='M0,0 Q50,50 100,0' style='stroke:black'/&gt;<br/>&lt;path d='m0,0 q50,50 100,0' style='stroke:black'/&gt;</span></td>
+
#弦的中點、頂點、控制點三點共線,且頂點為弦中點與控制點的中點。
<td>從目前點的座標畫條<br/>二次貝茲曲線到指定<br/>點的 x,y 座標:其中<br/> x1,y1 為控制點</td>
+
#控制點與弦的兩端點連線分別切圖形於兩端點。
</tr></table>
+
 
 +
 
 
二次貝茲曲線的參數方程為:
 
二次貝茲曲線的參數方程為:
  
B(t)=(1−t)<sup>2</sup>×P<sub>0</sub>+2(1−t)t×P<sub>1</sub>+t<sup>2</sup>×P<sub>2</sub>
+
B(t)(1−t)<sup>2</sup>×P<sub>0</sub>+2(1−t)t×P<sub>1</sub>+t<sup>2</sup>×P<sub>2</sub>, t∈[0,1]
  
其中:
+
將弦水平放置後,其中:
 
#t 是一個介於 0 到 1 之間的參數
 
#t 是一個介於 0 到 1 之間的參數
#P<sub>0</sub> 是起點
+
#P<sub>0</sub> 是起點,座標設為 (0,0)
#P<sub>1</sub> 是控制點
+
#P<sub>1</sub> 是控制點,座標設為 (α,β)
#P<sub>2</sub> 是終點
+
#P<sub>2</sub> 是終點,座標設為 (ɭ,0)
 +
圖形為:
 +
<img src='https://upload.wikimedia.org/wikipedia/commons/d/da/ControlPointsAndGraphicsOfQuadraticB%C3%A9zierCurve.svg' width='95%' height=* />
 +
 
 +
我們讓起迄點水平排列,並準備'''由控制點座標(α,β),求出最低點座標(a,b)'''。
 +
 
 
為了找到最大和最小的 y 值,我們可以對 y 的方程進行微分,並將其設為 0 以找到可能的極值。
 
為了找到最大和最小的 y 值,我們可以對 y 的方程進行微分,並將其設為 0 以找到可能的極值。
  
給定的點是:
+
====()先求控制點與最低點的 y 值關係====
:P<sub>0</sub>=(0,0)
+
將控制點的 y 值代入 B<sub>y</sub>(t) 的方程式,我們得到:
:P<sub>1</sub>=(α,β)
+
:B<sub>y</sub>(t)(1−t)<sup>2</sup>×0+2(1−t)t×β+t<sup>2</sup>×0=2β×t(1−t)=2β×(t−t<sup>2</sup>)
:P<sub>2</sub>=(ɭ,0)
+
它們代入 y 的方程,我們得到:
+
:y(t)=(1−t)<sup>2</sup>×0+2(1−t)t×β+t<sup>2</sup>×0=2β×t(1−t)=2β×(t−t<sup>2</sup>)
+
 
對其進行微分:
 
對其進行微分:
:y′(t)=2β(1-2t)
+
:B<sub>y</sub>′(t)=2β(1-2t)
 
將斜率設為 0 以解 t:
 
將斜率設為 0 以解 t:
 
:1−2t=0
 
:1−2t=0
:t=0.5
+
:t=<span style='font-stretch:condensed;'>½</span>
將 t=0.5 代入 y(t) ,我們得到:
+
將 t=<span style='font-stretch:condensed;'>½ </span>代入 B<sub>y</sub>(t) ,我們得到:
:y(0.5)=2β(0.5)(0.5)=0.5β
+
:B<sub>y</sub>(<span style='font-stretch:condensed;'>½</span>)=2β(<span style='font-stretch:condensed;'>½</span>)(<span style='font-stretch:condensed;'>½</span>)=<span style='font-stretch:condensed;'>½ </span>β
因此,最低點的 y 值是 0.5β,最高點因為在端點上,所以是 0
+
因此,最低點的 y 值是 <span style='font-stretch:condensed;'>½ </span>β
  
===一般化:===
+
====(二)次求控制點與最低點的 x 值關係:====
<img src='https://upload.wikimedia.org/wikipedia/commons/d/da/ControlPointsAndGraphicsOfQuadraticB%C3%A9zierCurve.svg' width='95%' height=* />
+
====由於起迄點水平排列, y 的極值均在 t=0.5 處====
+
起迄點水平排列,由控制點座標(α,β)求最低點座標(a,b):
+
  
由上一段推理得到 b=<span style='font-stretch:condensed;'>½ </span>β,此時 t=0.5
+
'''起迄點水平排列時, y 的極值均在 t=<span style='font-stretch:condensed;'>½</span> 處'''
  
B(t)=(1−t)<sup>2</sup>×P<sub>0</sub>+2(1−t)t×P<sub>1</sub>+t<sup>2</sup>×P<sub>2</sub>
+
由上一段推理得到 b=<span style='font-stretch:condensed;'>½ </span>β,此時 t=<span style='font-stretch:condensed;'>½</span>
  
B<sub>x</sub>(0.5)=2(0.5)(0.5)α+0.25ɭ=<span style='font-stretch:condensed;'>½ </span>α+<span style='font-stretch:condensed;'>¼ </span>ɭ=a
+
B(t)=(1−t)<sup>2</sup>×P<sub>0</sub>+2(1−t)t×P<sub>1</sub>+t<sup>2</sup>×P<sub>2</sub>, t∈[0,1]
  
 +
B<sub>x</sub>(<span style='font-stretch:condensed;'>½</span>)=2(<span style='font-stretch:condensed;'>½</span>)(<span style='font-stretch:condensed;'>½</span>)α+(<span style='font-stretch:condensed;'>½</span>)(<span style='font-stretch:condensed;'>½</span>)ɭ=<span style='font-stretch:condensed;'>½ </span>α+<span style='font-stretch:condensed;'>¼ </span>ɭ=a
  
 +
結合上段,可以發現弦的中點、頂點(最低點)、控制點三點共線,且'''頂點為弦中點與控制點的中點'''。
 +
 +
====(三)求端點的切線斜率====
 +
切線斜率為 B<sub>y</sub>′(t) / B<sub>x</sub>′(t)=2β(1-2t) / 2α+2(ɭ-2α)t=β(1-2t) / α+(ɭ-2α)t
 +
 +
當 t=0 ,斜率為 β / α ,恰為 <span class='overline-segment'>P<sub>1</sub>P<sub>0</sub></span> 的斜率
 +
 +
當 t=1 ,斜率為 -β / ɭ-α,恰為 <span class='overline-segment'>P<sub>1</sub>P<sub>2</sub></span> 的斜率
 +
 +
====(四)二次貝茲曲線的圖形是拋物線====
 +
將起點、迄點、控制點的座標一般化:
 +
:P<sub>0</sub> 座標 (x<sub>0</sub>,y<sub>0</sub>)
 +
:P<sub>1</sub> 座標 (α,β)
 +
:P<sub>2</sub> 座標 (x<sub>2</sub>,y<sub>2</sub>)
 +
B<sub>y</sub>(t)=(1−t)<sup>2</sup>×y<sub>0</sub>+2(1−t)t×β+t<sup>2</sup>×y<sub>2</sub>=y<sub>0</sub>+2(β-y<sub>0</sub>)t+(y<sub>0</sub>-2β+y<sub>2</sub>)t<sup>2</sup>
 +
:由於 B<sub>y</sub>(t)=mt<sup>2</sup>+nt+ɭ 的形式,所以 B<sub>y</sub>(t) 對 t 是一拋物線方程。
 +
若 B<sub>x</sub>(t) 為一線性函數,則 B<sub>y</sub>(t) 對 x 也將是一拋物線方程。
 +
:若 B<sub>x</sub>(t) 為一線性函數,則 (x-x<sub>0</sub>)=t×(x<sub>2</sub>-x<sub>0</sub>)
 +
:代入 B<sub>y</sub>(t) 得到將為 m′x<sup>2</sup>+n′x+ɭ′ 的形式,也是拋物線方程。
 +
 +
====(五)總結====
 
所以有:
 
所以有:
#Q=<span style='font-stretch:condensed;'>½ </span>(P+P<sub>1</sub>) ,P,Q,P<sub>1</sub>,三點共線,且 Q 為 <span style='text-decoration:overline'>PP<sub>1</sub></span> 的中點。
+
#t=<span style='font-stretch:condensed;'>½</span> 時弦對圖形垂直距離最大。
#<span style='text-decoration:overline'>P<sub>1</sub>P<sub>0</sub></span>, <span style='text-decoration:overline'>P<sub>1</sub>P<sub>2</sub></span> 分別切二次貝茲曲線 P<sub>0</sub>QP<sub>2</sub> 於 P<sub>0</sub>, P<sub>2</sub>
+
#Q=<span style='font-stretch:condensed;'>½ </span>(P+P<sub>1</sub>) ,P,Q,P<sub>1</sub>,三點共線,且 Q 為 <span class='overline-segment'>PP<sub>1</sub></span> 的中點。
 +
#<span class='overline-segment'>P<sub>1</sub>P<sub>0</sub></span>, <span class='overline-segment'>P<sub>1</sub>P<sub>2</sub></span> 分別切二次貝茲曲線 P<sub>0</sub>QP<sub>2</sub> 於 P<sub>0</sub>, P<sub>2</sub>
 +
#二次貝茲曲線 P<sub>0</sub>QP<sub>2</sub> 為拋物線。
 +
 
 +
===二次貝茲曲線在 SVG path 中的路徑表達語法===
 +
<table class=nicetable><tr>
 +
<td>Q or q<br/>(quadratic<br/>Bézier<br/>curve)</td>
 +
<td colspan=2>x1 y1 x y<br/><img src='http://jendo.org/wiki1231/images/a/a8/SvgPathQ.png' width='200px' height='*'/><br/><span style='font-size:90%'>&lt;path d='M0,0 Q50,50 100,0' style='stroke:black'/&gt;<br/>&lt;path d='m0,0 q50,50 100,0' style='stroke:black'/&gt;</span></td>
 +
<td>從目前點的座標畫條<br/>二次貝茲曲線到指定<br/>點的 x,y 座標:其中<br/> x1,y1 為控制點</td>
 +
</tr></table>
 +
 
 +
==三次貝茲曲線==
 +
<table class='putInto' align=right>
 +
<tr><th><img src='https://upload.wikimedia.org/wikipedia/commons/8/89/B%C3%A9zier_3_big.svg' width=240 height=100 /></th></tr>
 +
<tr><th>三次貝茲曲線的結構</th></tr>
 +
<tr><th><img src='https://upload.wikimedia.org/wikipedia/commons/d/db/B%C3%A9zier_3_big.gif' width=240 height=100 /></th></tr>
 +
<tr><th>三次貝茲曲線演示<br/>t在[0,1]區間</th></tr>
 +
</table>
 +
如右圖:'''P'''<sub>0</sub>、'''P'''<sub>1</sub>、'''P'''<sub>2</sub>、'''P'''<sub>3</sub>四個點在平面或在三維空間中定義了三次方貝茲曲線。曲線起始於'''P'''<sub>0</sub>(起點),走向'''P'''<sub>1</sub>(控制點),並從'''P'''<sub>2</sub>(控制點)的方向來到'''P'''<sub>3</sub>(迄點)。貝茲曲線不會經過'''P'''<sub>1</sub>或'''P'''<sub>2</sub>;這兩個點只是在那裡提供方向資訊,也叫「控制點」。
 +
 
 +
 
 +
 
 +
三次貝茲曲線的參數方程為:
 +
 
 +
B(t)=(1−t)<sup>3</sup>×P<sub>0</sub>+3(1−t)<sup>2</sup>t×P<sub>1</sub>+3(1−t)t<sup>2</sup>×P<sub>2</sub>+t<sup>3</sup>×P<sub>3</sub> , t∈[0,1]
 +
 
 +
我們將弦水平放置後,令: '''P'''<sub>0</sub> 座標為 (0,0) ,'''P'''<sub>3</sub> 座標為 (ɭ,0) ,不須考慮 ɭ 大小,僅由兩個控制點對弦的垂直高度,即可找到貝茲曲線上對弦的最大垂直距離( y 的極值);我們可以對 y 的方程進行微分,並將其設為 0 以找到可能的極值。
 +
 
 +
將弦水平放置後,其中:
 +
#t 是一個介於 0 到 1 之間的參數
 +
#P<sub>0</sub> 是起點,座標設為 (0,0)
 +
#P<sub>1</sub>,P<sub>2</sub> 是控制點,對弦的垂直距離分別為 h<sub>1</sub>,h<sub>2</sub>
 +
#P<sub>3</sub> 是終點,座標設為 (ɭ,0)
 +
 
 +
====(一)先求兩控制點與最低點的 y 值關係====
 +
將控制點的 y 值代入 B<sub>y</sub>(t) 的方程式,我們得到:
 +
:B<sub>y</sub>(t)=(1−t)<sup>3</sup>×0+3(1−t)<sup>2</sup>t×h<sub>1</sub>+3(1−t)t<sup>2</sup>×h<sub>2</sub>+t<sup>3</sup>×0=3×t(1−t)[h<sub>1</sub>-h<sub>1</sub>t+h<sub>2</sub>t]
 +
:&emsp;=3×t(1−t)[h<sub>1</sub>+(h<sub>2</sub>−h<sub>1</sub>)t]=3×[h<sub>1</sub>t+(h<sub>2</sub>−2h<sub>1</sub>)t<sup>2</sup>+(h<sub>1</sub>−h<sub>2</sub>)t<sup>3</sup>]
 +
對其進行微分:
 +
:B<sub>y</sub>′(t)=3[h<sub>1</sub>+2(h<sub>2</sub>-2h<sub>1</sub>)t+3(h<sub>1</sub>-h<sub>2</sub>)t<sup>2</sup>]
 +
將斜率設為 0 以解 t:
 +
:t=[2(2h<sub>1</sub>-h<sub>2</sub>)±√<span class='overline-segment'>4(h<sub>2</sub><sup>2</sup>-4h<sub>1</sub>h<sub>2</sub>+4h<sub>2</sub><sup>2</sup>)-4×3(h<sub>1</sub>-h<sub>2</sub>)h<sub>1</sub></span>] / 2×3(h<sub>1</sub>-h<sub>2</sub>)
 +
:&ensp;=[(2h<sub>1</sub>-h<sub>2</sub>)±√<span class='overline-segment'>h<sub>2</sub><sup>2</sup>-4h<sub>1</sub>h<sub>2</sub>+4h<sub>1</sub><sup>2</sup>-3h<sub>1</sub><sup>2</sup>+3h<sub>1</sub>h<sub>2</sub></span>] / 3(h<sub>1</sub>-h<sub>2</sub>)
 +
:&ensp;=[(2h<sub>1</sub>-h<sub>2</sub>)±√<span class='overline-segment'>h<sub>1</sub><sup>2</sup>-h<sub>1</sub>h<sub>2</sub>+h<sub>2</sub><sup>2</sup></span>] / 3(h<sub>1</sub>-h<sub>2</sub>)
 +
 
 +
====(二)特殊解:求兩控制點等高時====
 +
若 h<sub>1</sub>=h<sub>2</sub>=h
 +
:B<sub>y</sub>′(t)=3[h+2(-h)t]=0
 +
:h+2(-h)t=0 => h=2ht => t=½
 +
B<sub>y</sub>(½)=3[½h-¼h]=¾h
  
 
==參考文章==
 
==參考文章==
 
*[https://zh.wikipedia.org/wiki/貝茲曲線 貝茲曲線]
 
*[https://zh.wikipedia.org/wiki/貝茲曲線 貝茲曲線]
 
*[http://blog.iderzheng.com/continuous-and-smooth-bezier-curve/ 連續平滑的貝塞爾曲線]
 
*[http://blog.iderzheng.com/continuous-and-smooth-bezier-curve/ 連續平滑的貝塞爾曲線]
 +
*[http://www.kut.com.tw/Upload//ProductProbation/File/數學高三甲上第二章第3節主題4觀念一.pdf 二元二次方程式圖形判別的例題]<br/>---------- 擬合圓 (須四塊三次貝茲曲線組合,二次貝茲曲線要更多塊組合) ----------
 +
#[https://stackoverflow.com/questions/1734745/how-to-create-circle-with-b%c3%a9zier-curves/1734859 How to create circle with Bézier curves?]
 +
#[https://oomake.com/question/343212 如何使用Bézier曲線創建圓?]
 +
#[https://www.jianshu.com/p/5198d8aa80c1 用三阶贝塞尔曲线拟合圆]

2024年8月2日 (五) 00:36的最新修訂版本

一次貝茲曲線

B(t)=P0+(P1-P0)t=(1-t)P0+tP1, t∈[0,1]

B(t)描述一條由P0至P1的直線。例如當t=0.25時,B(t)即一條由點P0至P1路徑的四分之一處。

等同於線性插值。

二次貝茲曲線

二次貝茲曲線的結構
二次貝茲曲線演示
t在[0,1]區間

重點:

  1. 二次貝茲曲線畫出的是拋物線,無法畫出橢圓和雙曲線。故無法畫出正圓。
  2. 所有拋物線都「相似」(不是相等),且所有曲率(0~∞)的微線段都有。
  3. 兩端點外只有一個控制點。
  4. 拋物線方程式 ax2+bxy+cy2+dx+ey+f=0 則 b2 - 4ac=0 ,即前三項為完全平方式。

由二次貝茲曲線參數方程推導出四性質

  1. 二次貝茲曲線圖形(以下簡稱圖形)是拋物線的一段。
  2. t=½ 時弦與圖形垂直距離最大,圖形此處稱為頂點。
  3. 弦的中點、頂點、控制點三點共線,且頂點為弦中點與控制點的中點。
  4. 控制點與弦的兩端點連線分別切圖形於兩端點。


二次貝茲曲線的參數方程為:

B(t)=(1−t)2×P0+2(1−t)t×P1+t2×P2, t∈[0,1]

將弦水平放置後,其中:

  1. t 是一個介於 0 到 1 之間的參數
  2. P0 是起點,座標設為 (0,0)
  3. P1 是控制點,座標設為 (α,β)
  4. P2 是終點,座標設為 (ɭ,0)

圖形為:

我們讓起迄點水平排列,並準備由控制點座標(α,β),求出最低點座標(a,b)

為了找到最大和最小的 y 值,我們可以對 y 的方程進行微分,並將其設為 0 以找到可能的極值。

(一)先求控制點與最低點的 y 值關係

將控制點的 y 值代入 By(t) 的方程式,我們得到:

By(t)=(1−t)2×0+2(1−t)t×β+t2×0=2β×t(1−t)=2β×(t−t2)

對其進行微分:

By′(t)=2β(1-2t)

將斜率設為 0 以解 t:

1−2t=0
t=½

將 t=½ 代入 By(t) ,我們得到:

By(½)=2β(½)(½)=½ β

因此,最低點的 y 值是 ½ β 。

(二)次求控制點與最低點的 x 值關係:

起迄點水平排列時, y 的極值均在 t=½

由上一段推理得到 b=½ β,此時 t=½

B(t)=(1−t)2×P0+2(1−t)t×P1+t2×P2, t∈[0,1]

Bx(½)=2(½)(½)α+(½)(½)ɭ=½ α+¼ ɭ=a

結合上段,可以發現弦的中點、頂點(最低點)、控制點三點共線,且頂點為弦中點與控制點的中點

(三)求端點的切線斜率

切線斜率為 By′(t) / Bx′(t)=2β(1-2t) / 2α+2(ɭ-2α)t=β(1-2t) / α+(ɭ-2α)t

當 t=0 ,斜率為 β / α ,恰為 P1P0 的斜率

當 t=1 ,斜率為 -β / ɭ-α,恰為 P1P2 的斜率

(四)二次貝茲曲線的圖形是拋物線

將起點、迄點、控制點的座標一般化:

P0 座標 (x0,y0)
P1 座標 (α,β)
P2 座標 (x2,y2)

By(t)=(1−t)2×y0+2(1−t)t×β+t2×y2=y0+2(β-y0)t+(y0-2β+y2)t2

由於 By(t)=mt2+nt+ɭ 的形式,所以 By(t) 對 t 是一拋物線方程。

若 Bx(t) 為一線性函數,則 By(t) 對 x 也將是一拋物線方程。

若 Bx(t) 為一線性函數,則 (x-x0)=t×(x2-x0)
代入 By(t) 得到將為 m′x2+n′x+ɭ′ 的形式,也是拋物線方程。

(五)總結

所以有:

  1. t=½ 時弦對圖形垂直距離最大。
  2. Q=½ (P+P1) ,P,Q,P1,三點共線,且 Q 為 PP1 的中點。
  3. P1P0, P1P2 分別切二次貝茲曲線 P0QP2 於 P0, P2
  4. 二次貝茲曲線 P0QP2 為拋物線。

二次貝茲曲線在 SVG path 中的路徑表達語法

Q or q
(quadratic
Bézier
curve)
x1 y1 x y

<path d='M0,0 Q50,50 100,0' style='stroke:black'/>
<path d='m0,0 q50,50 100,0' style='stroke:black'/>
從目前點的座標畫條
二次貝茲曲線到指定
點的 x,y 座標:其中
x1,y1 為控制點

三次貝茲曲線

三次貝茲曲線的結構
三次貝茲曲線演示
t在[0,1]區間

如右圖:P0P1P2P3四個點在平面或在三維空間中定義了三次方貝茲曲線。曲線起始於P0(起點),走向P1(控制點),並從P2(控制點)的方向來到P3(迄點)。貝茲曲線不會經過P1P2;這兩個點只是在那裡提供方向資訊,也叫「控制點」。


三次貝茲曲線的參數方程為:

B(t)=(1−t)3×P0+3(1−t)2t×P1+3(1−t)t2×P2+t3×P3 , t∈[0,1]

我們將弦水平放置後,令: P0 座標為 (0,0) ,P3 座標為 (ɭ,0) ,不須考慮 ɭ 大小,僅由兩個控制點對弦的垂直高度,即可找到貝茲曲線上對弦的最大垂直距離( y 的極值);我們可以對 y 的方程進行微分,並將其設為 0 以找到可能的極值。

將弦水平放置後,其中:

  1. t 是一個介於 0 到 1 之間的參數
  2. P0 是起點,座標設為 (0,0)
  3. P1,P2 是控制點,對弦的垂直距離分別為 h1,h2
  4. P3 是終點,座標設為 (ɭ,0)

(一)先求兩控制點與最低點的 y 值關係

將控制點的 y 值代入 By(t) 的方程式,我們得到:

By(t)=(1−t)3×0+3(1−t)2t×h1+3(1−t)t2×h2+t3×0=3×t(1−t)[h1-h1t+h2t]
 =3×t(1−t)[h1+(h2−h1)t]=3×[h1t+(h2−2h1)t2+(h1−h2)t3]

對其進行微分:

By′(t)=3[h1+2(h2-2h1)t+3(h1-h2)t2]

將斜率設為 0 以解 t:

t=[2(2h1-h2)±√4(h22-4h1h2+4h22)-4×3(h1-h2)h1] / 2×3(h1-h2)
 =[(2h1-h2)±√h22-4h1h2+4h12-3h12+3h1h2] / 3(h1-h2)
 =[(2h1-h2)±√h12-h1h2+h22] / 3(h1-h2)

(二)特殊解:求兩控制點等高時

若 h1=h2=h

By′(t)=3[h+2(-h)t]=0
h+2(-h)t=0 => h=2ht => t=½

By(½)=3[½h-¼h]=¾h

參考文章

  1. How to create circle with Bézier curves?
  2. 如何使用Bézier曲線創建圓?
  3. 用三阶贝塞尔曲线拟合圆