朱金燦
假如我們採用向量表示式來表示引數化的二次曲線,那麼可以把拋物線的表示式寫成如下的一般形式:
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...