貝塞爾曲線上一點

2021-06-17 23:22:45 字數 1666 閱讀 1499

計算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 拋物線三切線定理

當p0

,p2 固定,引入引數t,

令上述比值為

t:(1-

t) ,即有:

t從0變到1,第

一、二式就分別表示控制二邊形的第

一、二條邊,它們是兩條一次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...