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

2021-08-29 03:43:27 字數 3570 閱讀 3584

朱金燦

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

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時,曲線過p

2點,且切向量等於p3—p

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

1= p1

t=1:

p(1)= a

1+ a

2+ a3=p

3t=0.5:p(0.5)=a1

+ 0.5a

2+0.25 a3=p

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

1、 a

2、 a

3分別為: a

1= p1a

2=4 p2—p

3—3p1

a3=2p1

+2p3

—4p2

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

1+ a

2t+ a3t

2得:p(t)=(2t—3t+1)p

1+(4t—4t2)p

2+(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)=(2t2i

—3ti

+1)p

i+(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)=(2t

2i+1

—3ti+1

+1)p

i+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和t

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

t=2tti

=0.5+t

ti+1=t

這樣pi+1

(t)=

(—2t

3+4t

2—t)p

i+(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,到p

i+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());}

程式效果圖:

自由端曲線:

封閉端曲線:

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!朱金燦 假如我們採用向量表示式來表示引數化的二次曲線,那麼可以把拋物線的表示式寫成如下的一般形式 p t a 1 a 2t a3t 2 0 該拋物線過p 1,p 2,p 3三個點,並且 1.拋物線以p 1點為始點。當參變數t 0 時,曲線過p1點 ...

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...