拋物樣條曲線的原理說明及畫拋物曲線的乙個類

2021-08-31 12:28:38 字數 3931 閱讀 2533

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

朱金燦              

假如我們採用向量表示式來表示引數化的二次曲線,那麼可以把拋物線的表示式寫成如下的一般形式:

p(t)=a

1+ a

2t+ a3t

2(0=

該拋物線過p

1, p

2, p

3三個點,並且:

1.拋物線以p

1點為始點。當參變數t=0

時,曲線過p1點;

2.拋物線以p

3點為終點。當參變數t=0

時,曲線過p3點;

3.當參變數t=0.5

時,曲線過p2點,

且切向量等於p3—p

1。t=0: p(0)= a

1= p

1t=1:

p(1)= a

1+ a

2+ a3=p

3t=0.5:p(0.5)=a1

+ 0.5a

2+0.25 a3=p

2通過解聯立方程,得到三個引數a1、a

2、a3分別為: a1

= p1a2

=4 p2—p

3—3p1a

3=2p

1+2p

3—4p2

把求出的這三個係數的值,代入拋物線的表示式p(t)=a

1+ a

2t+ a3t

2得:p(t)=

(2t—3t+1)p1

+(4t

—4t2)p2

+(4t

2—t)p

3  

(0=

設有一離散型值點列p

i(i=1,2,……,n

),每經過相鄰三點作一段拋物線,由於有n

個型值點,所以可以做n-2

條拋物線段。

在這n—2條拋物線段中,第i

條拋物線段為經過p

i, p

i+1, p

i+2三點,所以它的表示式應為:si(t

i)=(2t2

i—3ti+1

)pi+(4 t

i—4 t2i

) pi+1

+(2t2i

—ti) pi+2

(0=< t

i<=1)

同理,第i+1

條拋物線段為經過p

i+1, p

i+2, p

i+3三點,所以它的表示式應為:s

i+1(t

i+1)=

(2t2

i+1—3t

i+1+1

)pi+1

+(4 t

i+1—4 t

2i+1

) pi+2

+(2t

2i+1

—ti+1

) pi+3

(0=< t

i+1<=1)

一般來說,每兩段曲線之間的搭接區間,兩條拋物線是不可能重合的。如下圖所示:

顯然,對於擬合曲線來說,整個型值點必須只能用一條光滑的曲線連線起來。為了做到這一點,必須找一種方法把si和s

i+1這樣的曲線段的共同區間結合起來。這種方法就是加權合成方法。

我們設共同區間的函式是p

i+1(t)=f (t )si

(ti)+g ( t) s

i+1(t

i+1).

其中f (t )

和g ( t)

是權函式。在拋物樣條曲線中我們取簡單的一次函式為權函式,且具有互補性,設

f (t ) =1—t

g ( t) =t

這樣pi+1

(t)= (1

—t ) si

(ti)+ t s

i+1(t

i+1).

因為函式中有t、ti

和ti+1

三個引數,因此接下來我們的工作是統一引數。我們可以三個參變數統一形式為:

t=2tti

=0.5+t

ti+1=t

這樣pi+1(t)=

(—2t

3+4t2—t

)pi+(12t

3—410t

2+1) p

i+1+(

—12t

3+8t

2+t) p

i+2+

(4t3

—2t2

) pi+3

(0=< t

i<=0.5)

從幾何意義上說,函式p

i+1(t)

表示的上圖的點p

i+1,

到pi+2

之間的線段。但是我們應該看到這種方法從n

個點中只能得到n

—3段曲線。但是n

個型值點應有n

—1段曲線。乙個直接的想法是新增兩個輔助點。那麼如何新增呢?

方法一:兩個輔助點為p0和p

n+1,  p

0=p1

,pn+1=p

n ,這樣畫出的曲線為一條不閉合的自由曲線。

方法二:新增三個輔助點,p0、p

n+1和p

n+2,然後p

0=pn

,pn+1=p

1,,p

n+2=p2

,這樣畫出的曲線為一條閉合的曲線。

下面介紹根據上面原理而設計的乙個畫拋物曲線的乙個類:

class cparspl : public cobject  ;

const int  clip=10;

cparspl::cparspl()  //

預設的建構函式

cparspl::~cparspl()

cparspl::cparspl(int nlinestyle,int nlinewidth, colorref crlinecolor)

void cparspl::setpoint(const cpoint &point)

void cparspl::drawfreeline(cdc *pdc)

pdc->lineto(parsplpoint[i+2].x,parsplpoint[i+2].y); }

for(i=0;i

/* 將舊畫筆選回裝置環境*/

pdc->selectobject(plinepen);

/*刪除輔助點

*/parsplpoint.removeat(parsplpoint.getupperbound()); }

void cparspl::drawcloseline(cdc *pdc)

pdc->lineto(parsplpoint[i+2].x,parsplpoint[i+2].y); }

for(i=0;i

/*將舊畫筆選回裝置環境*/

pdc->selectobject(plinepen);

/*刪除最後兩個輔助點*/

parsplpoint.removeat(parsplpoint.getupperbound());

parsplpoint.removeat(parsplpoint.getupperbound()); }

程式效果圖:

自由端曲線:

封閉端曲線:

給我老師的人工智慧教程打call!

拋物樣條曲線的原理說明及畫拋物曲線的乙個類

朱金燦 假如我們採用向量表示式來表示引數化的二次曲線,那麼可以把拋物線的表示式寫成如下的一般形式 p t a 1 a 2t a3t 2 0 該拋物線過p 1,p 2,p 3三個點,並且 1.拋物線以p 1點為始點。當參變數t 0時,曲線過p1點 2.拋物線以p 3點為終點。當參變數t 0時,曲線過p...

CSGL OPENGL C 下的拋物樣條曲線

各種曲線啊,貝塞爾曲線,b樣條曲線,拋物曲線,正弦曲線。弄的我頭暈眼花,其實我要的很簡單,就是三個點確定條曲線 拋物曲線 環境 vs2008 語言 c spline.cs是封裝的實體類 csglcontrol.cs繼承openglcontrol 在csglcontrol下呼叫spline實體的dra...

Ceres解析求導 乙個曲線擬合的例子

假設有一組觀測資料 left 由以下公式得到,n wn w nw 為雜訊。f x em x cf x e f x e mx c y f x nwy f x n w y f x nw 其中m 0.3,c 0.1m 0.3,c 0.1 m 0.3,c 0.1。現在我們根據得到的觀測資料,去估計m,c m...