分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
朱金燦
假如我們採用向量表示式來表示引數化的二次曲線,那麼可以把拋物線的表示式寫成如下的一般形式:
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...