一少态、前言
本系列文章通過介紹 貝塞爾曲線 的基礎(chǔ)知識(shí),貝塞爾曲線在iOS中的應(yīng)用以及一些高級(jí)技巧易遣,循序漸進(jìn)彼妻,試圖讓讀者對(duì)iOS的中貝塞爾曲線知識(shí)有一個(gè)較系統(tǒng)的認(rèn)識(shí)。
你可能在很多地方聽說過貝塞爾曲線豆茫,但是貝塞爾曲線到底是什么侨歉,它有什么特性能讓它有這么高的知名度,它到底有什么用呢揩魂?
二幽邓、貝塞爾曲線簡(jiǎn)介
1. 貝塞爾曲線 是什么

頭一次聽,可能以為他和牛頓定律火脉,斐波那契數(shù)列一樣是由一個(gè)名字叫貝塞爾的人發(fā)明的牵舵,然而并不是柒啤。其實(shí)貝塞爾曲線的數(shù)學(xué)基礎(chǔ)最早是1912年就在當(dāng)世廣為人知的伯恩斯坦多項(xiàng)式,那什么又是伯恩思坦多項(xiàng)式呢畸颅,簡(jiǎn)單地說担巩,伯恩斯坦多項(xiàng)式是用來(lái)證明,在 [a, b]區(qū)間上所有的連續(xù)函數(shù)都可以多項(xiàng)式來(lái)逼近没炒,并且一致收斂涛癌,再簡(jiǎn)單地說,就是在一個(gè)連續(xù)函數(shù)送火,你可以將它寫成n個(gè)伯恩思坦多項(xiàng)式相加的形式拳话,并且隨著n 趨向于無(wú)窮大,這個(gè)多項(xiàng)式將一致收斂到原函數(shù)种吸。
聽不懂弃衍,沒關(guān)系,繼續(xù)往下看坚俗。
雖然在1912年就已經(jīng)被發(fā)現(xiàn)镜盯,但是其對(duì)圖形的適用性在半個(gè)世紀(jì)內(nèi)者也沒有被實(shí)現(xiàn),直到1959年在雪鐵龍汽車就職的數(shù)學(xué)家 Paul de Casteljau坦冠,開始對(duì)伯恩斯坦多項(xiàng)式進(jìn)行圖形化的嘗試形耗,并推出一種新的數(shù)值穩(wěn)定(即在求伯恩斯坦多項(xiàng)式的時(shí)候不會(huì)引入數(shù)值誤差)遞歸算法 de Casteljau 算法用來(lái)伯恩斯坦多項(xiàng)式。根據(jù)這個(gè)算法辙浑,就可以只通過很少的控制點(diǎn)激涤,去生成復(fù)雜的平滑曲線,也就是貝塞爾曲線判呕。
而貝塞爾曲線的成名倦踢,得益于法國(guó)工程師 Pierre Bézier ,他將這種算法用來(lái)輔助雷諾汽車的車體工業(yè)設(shè)計(jì)侠草,并且得到廣泛宣傳辱挥。
2. 現(xiàn)實(shí)應(yīng)用
正是因?yàn)槠淅L制簡(jiǎn)便卻具有極強(qiáng)的描述能力,貝塞爾曲線在工業(yè)設(shè)計(jì)領(lǐng)域迅速得到了廣泛的推廣和應(yīng)用边涕。隨后隨著計(jì)算機(jī)技術(shù)的發(fā)展晤碘,在計(jì)算機(jī)圖形學(xué)領(lǐng)域,尤其是矢量圖形學(xué)功蜓,貝塞爾曲線也占有了重要的地位园爷。
今天我們使用的繪圖軟件,Illustrator式撼、CorelDraw 等童社,無(wú)一例外都提供了繪制貝塞爾曲線的功能。甚至像 Photoshop 這樣的位圖編輯軟件著隆,也把貝塞爾曲線作為僅有的矢量繪制工具(鋼筆工具)包含其中扰楼。
這里的一個(gè)網(wǎng)站可以在線模擬鋼筆工具的使用:http://bezier.method.ac/
推廣到三維空間的貝塞爾曲面呀癣,以及更進(jìn)一步的非均勻有理 B 樣條(NURBS),早已成為當(dāng)今計(jì)算機(jī)輔助設(shè)計(jì)(CAD)的行業(yè)標(biāo)準(zhǔn)弦赖,不論是我們平常用到的各種產(chǎn)品项栏,還是在電影院看到的精彩大片,都少不了它們的功勞腾节。
二忘嫉、如何繪制貝塞爾曲線
下面我們就通過例子來(lái)了解一下如何用 de Casteljau 算法繪制一條貝塞爾曲線荤牍。
- 畫線段AC案腺,BC, 相交于C點(diǎn).
- 在線段AC取點(diǎn)D,BC上取點(diǎn)E使
AD:DC = CE:EB
康吵。 如下圖所示:
3.連接點(diǎn)D劈榨、E
4.在線段DE上取點(diǎn)F,使 AD:DC = CE:EB = DF:FE
晦嵌。 如下圖:
那么我們就找到了貝塞爾曲線上的點(diǎn)F同辣,這時(shí)讓選取的點(diǎn) D 在線段AB上從起點(diǎn) A 移動(dòng)到終點(diǎn) B,找出所有的貝塞爾曲線上的點(diǎn) F惭载。所有的點(diǎn)找出來(lái)之后旱函,我們也得到了這條貝塞爾曲線。如下圖:
如果你實(shí)在想象不出這個(gè)過程描滔,沒關(guān)系棒妨,看動(dòng)畫!
這樣就畫出了一條貝塞爾曲線含长。
貝塞爾曲線的一個(gè)比較好的動(dòng)態(tài)演示網(wǎng)站:http://myst729.github.io/bezier-curve
三券腔、多次(階)貝塞爾曲線
回過頭來(lái)看這條貝塞爾曲線,
為了確定曲線上的一個(gè)點(diǎn)拘泞,需要在線段AC和BC上進(jìn)行取點(diǎn)的操作纷纫,A、B陪腌、C三個(gè)點(diǎn)被稱為控制點(diǎn)辱魁,因此我們稱得到的曲線為二(控制點(diǎn)個(gè)數(shù)n-1)次貝塞爾曲線。
根據(jù)控制點(diǎn)的個(gè)數(shù)诗鸭,貝塞爾曲線被分為一次貝塞爾曲線染簇,二次貝塞爾曲線(3個(gè)控制點(diǎn))、三次貝塞爾曲線(4個(gè)控制點(diǎn))等等只泼,以此類推剖笙。
還有只有兩個(gè)控制點(diǎn)的一次貝塞爾曲線,沒錯(cuò)是一條線段请唱,它是貝塞爾曲線的特殊情況:
四弥咪、附
綜上可以看出使用貝塞爾曲線可以畫出各式各樣的圓形过蹂,也可以畫出一條直線段。另外聚至,貝塞爾曲線有以下兩個(gè)重要的特性:
- 貝塞爾曲線總會(huì)通過第一個(gè)和最后一個(gè)控制點(diǎn)酷勺。曲線始點(diǎn)處的切線落在前兩個(gè)控制點(diǎn)的連線上,曲線終點(diǎn)處的切線落在后兩個(gè)控制點(diǎn)的連線上扳躬。
- 貝塞爾曲線始終在控制點(diǎn)圍成的凸多邊形內(nèi)脆诉。
五贷币、至此
至此我們了解了貝塞爾曲線的基本知識(shí)击胜。