CGContextAddCurveToPoint 這個函數看上去通常般,仔細琢磨發現不簡單,爲何三個點就能夠肯定一條曲線呢? 網上查了查,小小研究了一下下。算法
1.關鍵知識 竊取自 (http://learn.gxtc.edu.cn/NCou...)函數
Bezier曲線spa
在工程設計中,由給定型值點進行曲線設計每每因爲型值點的偏差而得不到滿意的結果。另外一方面,在一些更注重外觀的設計中,型值點的精度又不很重要。從 1962年起,法國雷諾汽車公司的Bezier開始構造他的以「逼近」爲基礎的參數曲線表示法。以這種方法爲基礎,完成了一種自由型曲線和曲面的設計系統 UNIS-URF,1972年在雷諾汽車公司正式使用。設計
Bezier曲線的形狀是經過一組多邊折線(稱爲特徵多邊形)的各頂點惟一地定義出來的。在多邊形的各頂點中,只有第一點和最後一點在曲線上,其他的頂 點則使用控制曲線的導數、階次和形式。第一條和最後一條折線則表示出曲線在起點和終點處的切線方向。曲線的形狀趨向仿效多邊折線的形狀。改變控制點與改變 曲線形狀有着形象生動的直接聯繫。如圖2.6所示。htm
1)Bezier曲線的定義
遞歸
給定 n+ l個空間向量bi(i= 0,l,…,n),稱 n次參數曲線段
get
爲Bezier曲線。式中使用了Bernstein多項式Bi,n(u)做爲基函數
數學
u是局部參數,u∈[0,1]。咱們給出n=3的Bezier曲線的矩陣表示:
產品
則有 P(u)=UMBit
2)Bezier曲線的性質
Bezier曲線的基本數學表達式:
這說明Bezier曲線在始點和終點處的切線方向是與Bezier控制多邊形的第一邊及最後一邊的走向一致。
這 說明曲線在起點和終點處的二階導數僅與相鄰的二點位置有關,而與其他各點的位置關。Bezier曲線的這一特性說明,只需適當移動控制點就能得到滿意的曲 線位置和形狀。利用這個特性,當採用分段Bezier曲線時,只要保證曲線在接點處的折線共線,就能夠獲得C1連續性。如圖2.7所示的一個公共端點的二 條Bezier曲線,當兩段曲線的控制折線在接點處共線時,就保證了它們連成的曲線在公共端點的一階連續。
Bezier曲線還具備凸包性,即B6zier曲線均落在由它的控制點造成的凸殼內。所謂凸殼是指用橡皮圖從外面去套全部控制點所造成的凸多邊形。研究代表,分段Bezier曲線的凸包性體現更明顯,這對於曲線的分割求交將更爲有利。
此外,Bezier曲線的形狀僅與特徵多邊形各控制點bi有關,它不依賴於座標系的選擇,所以具備幾何不變性。沒有局部控制能力是 Bezier曲線的一個缺點。在工程中,產品的模型經常須要局部修改。缺少局部控制的能力在工程中是難以接受的。Bezier曲線另外一缺點是隨着控制點的 增長,曲線的次數也增長,於是計算量增大。下面介紹的B樣條曲線可克服這兩個缺點。
3)Bezier曲線的計算及分割做圖法
Bezier曲線在工程中普遍接受的一個重要緣由是其能夠採用很是簡單的方法制做。下面推導Bezier多項式的遞歸關係,這種關係可方便用計算機程序實現,並且便於用圖形來解釋。重寫Bezier曲線方程爲
能夠看到,第一個括號內的項造成對控制點b0,b1,…,bn-1的Bezier多項式,而第二個方括號內的項對b1,b2,…,bn造成多項式。如今引人符號Pk,i(u)表示對bk,bk+l,…,b的Bezier多項式,那麼上述
方程能夠重寫爲
上式代表,Bezier多項式能夠由另外兩個這種多項式求得。其求法爲用一條線鏈接相應的點(即在同一參數U),並與u成比例地分那條線。
我 們再用圖2.8所示的例子來看一下Bezier曲線的分割做圖法。前例給出的由點b0,b1,b2,b3控制成的一條三次Bezier曲線可在u=l/2 處分段,分紅b4的兩段均爲Bezier曲線,它們由各自的四個控制點控制。在圖2.8中,點b0,b1,b2和b3控制造成一條三次,Bezier曲 線。取線段bobl的中點b4,線段b1b2的中點b5,線段 b2b3的中點 b6,線段 b4b5的中點 b7,線段 b5 b6的中點b8,以及線段b7bs的中點bg,則能夠證實,b9在由b。,b1,b2,b3肯定的三次Bezier曲線上,且爲u=l/2時的點 P(l/2)。咱們將u=l/2代人矩陣方程就可獲得:
圖 2.8的分割,咱們得到折線b0b4 b7b9b8b6b3,它比折線b0blb2b3更接近該BeZier曲線,且b9在曲線上。繼續分別對由b9分紅的兩段曲線做分割,除得到更接近曲線的 折線外,還得到曲線上的兩個點。分割次數越多,新的折線越逼近曲線,當到達某種精度時,可將得到的折線近似的表達Bezier曲線。因爲分割操做僅涉及加 法和移位操做,因此便於硬件實現,提升做圖速度。讀者可根據送推式寫出相應的計算機程序,進一步從幾何做圖的角度,對計算式改進,以便使算法更爲簡單。
以上部分爲算法原理,下面是實際的應用
使用函數CGContextAddCurveToPoint去 使用一個三次Bezier 曲線,要咱們指定control point和endpoint。下圖是一個三次的Bezier曲線,有兩個控制點。兩個控制點的定義了曲線的幾何形狀。若是兩個控制點都在起點和終點的下 面,則則曲線向上供。若是第二個控制點相比第一個控制點更接近起點,則曲線會構成一個循環。
使用函數CGContextAddQuadCurveToPoint 去使用添加一個二次Bezier曲線,要咱們指定一個control point和endpoint。下圖展現了相同的endpoint,不一樣的control point的結果。control point定義了曲線的供的方向。利用二次Bezier曲線不可能創造用三次Bezier曲線那麼多的有趣的曲線。例如,用二次不可能創造一個交叉的曲 線。