計算bezier曲線上的點,可用bezier曲線方程,但使用de casteljau提出的遞推算法則要簡單得多。
如圖3.1.10所示,設p0
、p02、p
2是一條拋物線上順序三個不同的點。過p0和p
2點的兩切線交於p1
點,在p02
點的切線交p0p
1和p2p
1於p01
和p11,則如下比例成立:
這是所謂拋物線的三切線定理。
圖3.1.10 拋物線三切線定理
當p0t從0變到1,第,p2 固定,引入引數t,
令上述比值為
t:(1-
t) ,即有:
一、二式就分別表示控制二邊形的第
一、二條邊,它們是兩條一次bezier曲線。將
一、二式代入第三式得:
t從0變到1時,它表示了由三頂點p0
、p1、
p2三點定義的一條二次bezier曲線。並且表明:這二次bezier曲線p0
2可以定義為分別由前兩個頂點(p0
,p1)和後兩個頂點(p1
,p2)決定的一次bezier曲線的線性組合。依次類推,由四個控制點定義的三次bezier曲線p0
3可被定義為分別由(p0
,p1,
p2)和(p1,
p2,p
3)確定的二條二次bezier曲線的線性組合,由(
n+1)個控制點pi
(i=0,1,...,
n)定義的
n次bezier曲線p0
n可被定義為分別由前、後
n個控制點定義的兩條(
n-1)次bezier曲線p0
n-1與p1
n-1的線性組合:
由此得到bezier曲線的遞推計算公式:
這便是著名的
de casteljau
演算法。用這一遞推公式,在給定引數下,求bezier曲線上一點p(t
)非常有效。上式中:pi
0=pi
是定義bezier曲線的控制點,p0n
即為曲線p(t
)上具有引數t的點。de casteljau演算法穩定可靠,直觀簡便,可以編出十分簡捷的程式,是計算bezier曲線的基本演算法和標準演算法。
當n=3
時,de casteljau演算法遞推出的pi
k呈直角三角形,對應結果如圖3.1.11所示。從左向右遞推,最右邊點p0
3即為曲線上的點。
圖3.1.11 n=3時,pi
n的遞推關係
t:(1-
t)的兩段。依次對原始控制多邊形每一邊執行同樣的定比分割,所得分點就是第一級遞推生成的中間頂點pi
1(i=0,1,
...,
n-1),
對這些中間頂點構成的控制多邊形再執行同樣的定比分割,得第二級中間頂點pi2
(i=0,1,
...,
n-2)
。重複進行下去,直到
n級遞推得到乙個中間頂點p0
n即為所求曲線上的點p(
t),如圖3.1.12所示。
圖3.1.12 幾何作圖法求bezier曲線上一點(n=3,t=1/4)
獲取貝塞爾曲線上的100個點
include typedefstruct point2d void computebezier point2d cp,int numberofpoints,point2d curve int main int argc,const char argv int number 100 point2d ...
判斷 點在曲線上 根據貝塞爾曲線上的點反算t值
專案中使用的是二次貝塞爾曲線,所以本文也主要以二次貝塞爾曲線為講解重點。要實現上述動畫,需要首先確定a點和b點在曲線上面的比例值ta和tb 最終的需求變成 根據貝塞爾曲線上的點反算t值 大概有以下幾種方法。現假設貝塞爾曲線上的點為點p 後續會用到該點 分片迭代是一種近似的方法。我們知道,二次貝塞爾曲...
試驗 貝塞爾陣列點的展開
用polybezier hdc,point,count 繪製很漂亮 但是用公式展開就不對。polybezier函式會對陣列點做怎樣的處理?gdi提供的繪圖函式是怎樣進行繪圖的?point testpt 10 pointf mijipt 4000 testpt 0 x 374 testpt 0 y 9...