iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0

學習設計的人在使用Adobe Illustrator這類向量繪圖軟體的時候,都會使用一種鋼筆工具。
pen
這個工具會產生控制桿,設計人員可以利用這個控制桿來擬合已有的圖形曲線,或是創造自己希望的曲線,而這種曲線便是貝茲曲線。

貝茲曲線由保爾·德·卡斯特里奧(Paul de Casteljau)於1959年開發,法國工程師皮埃爾·貝茲(Pierre Bézier)運用貝茲曲線來為汽車的主體進行設計,並廣泛發表。

今天就來介紹貝茲曲線的原理,還有如何在JSXGraph中使用它。

貝茲曲線原理

假設給定平面上兩個點https://chart.googleapis.com/chart?cht=tx&chl=P_1https://chart.googleapis.com/chart?cht=tx&chl=P_2 ,則對應這兩點的貝茲曲線就是通過這兩點的線段,也就是一次貝茲曲線,可以表示為https://chart.googleapis.com/chart?cht=tx&chl=(1-t)P_1%2BtP_2https://chart.googleapis.com/chart?cht=tx&chl=0%5Cleq%20t%5Cleq%201 ,給定三個點https://chart.googleapis.com/chart?cht=tx&chl=P_1%2C%20P_2%2C%20P_3 ,假設https://chart.googleapis.com/chart?cht=tx&chl=L_1 是對應https://chart.googleapis.com/chart?cht=tx&chl=P_1https://chart.googleapis.com/chart?cht=tx&chl=P_2 的一次貝茲曲線,https://chart.googleapis.com/chart?cht=tx&chl=L_2 是對應https://chart.googleapis.com/chart?cht=tx&chl=P_2https://chart.googleapis.com/chart?cht=tx&chl=P_3 的一次貝茲曲線,則對應這三點的貝茲曲線為 https://chart.googleapis.com/chart?cht=tx&chl=(1-t)L_1%2BtL_2https://chart.googleapis.com/chart?cht=tx&chl=0%5Cleq%20t%5Cleq%201 此時https://chart.googleapis.com/chart?cht=tx&chl=P_2 為控制點,同理可推廣至三次貝茲曲線(Cubic Bezier Curve),此時會有二個控制點,一般繪圖軟體使用的貝茲曲線,便是三次貝茲曲線。

利用貝茲曲線的原理,我們可以在JSXGraph作出三次貝茲曲線,執行成果如下圖。
Bezier
其中A、D是資料點,而B、C是控制點。

JSXGraph內為貝茲曲線

JSXGraph本身就有內建貝茲曲線可以使用,其方法為JXG.Math.Numerics.bezier(p),其中p為一陣列,存放資料點和控制點,共有3k+1個元素,k=1, 2, 3, ...;其中第p[3k]元素為資料點,p[3k+1]和p[3k+2]為控制點。

let p = [];

let color = 'red'; 
p.push(board2.create('point',[7,1],{strokeColor:color,fillColor:color, name: '\\(A\\)'}))       // data point
color = 'blue'
p.push(board2.create('point',[3,7],{strokeColor:color,fillColor:color, name: '\\(B\\)'}))  // control point
p.push(board2.create('point',[-2,6],{strokeColor:color,fillColor:color, name: '\\(C\\)'}))  // control point

color = 'red'
p.push(board2.create('point',[-6,1],{strokeColor:color,fillColor:color, name: '\\(D\\)'}))      // data point

let bezier = board2.create('curve', JXG.Math.Numerics.bezier(p), 
               {strokecoloror:'blue', strokeOpacity:0.6, strokeWidth:5})

執行結果
Bezier2

程式原始碼

今日程式原始碼

今日小結

函數擬合一直是數值分析在工程和設計上非常重要的應用,今天談到的貝茲曲線已經是設計人員必須精熟的技巧;另外貝茲曲線的延伸B-Spline曲線則是使用分段擬合的精神來進行擬合,在工程上和設計上的應用也很多,JSXGraph也有提供JXG.Math.Numerics.bezier(p, order)方法,連續兩天介紹數學的應用,希望能激發更多人學習數學的熱情,明天見!


上一篇
曲柄搖桿機構
下一篇
數學家的情書
系列文
30天數學老師作互動式教學網頁30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言