b樣條擬合通常把離散點集作為控制點來求擬合曲線,原理和過程可參看
如果想要求得過離散點的插值曲線,需要先用離散點反求控制點,然後用求得的控制點擬合曲線。原理在這篇文章中介紹較詳細
通過離散點集反求控制點
*/vector
bsplineinterpolate
(vector discretepoints)
mat v = mat::
zeros
(size(2
, n)
, cv_32f)
;float
* vdata =
(float
*)v.data;
int idx =0;
for_each
(discretepoints.
begin()
, discretepoints.
end(),
[&vdata,
&idx]
(point2f p2f));
v *=6
; mat p = weight.
inv(
)*v;
vector
res(discretepoints.
size()
);float
* pdata =
(float
*)p.data;
idx =0;
for_each
(res.
begin()
, res.
end(),
[&idx, pdata]
(point2f& p2f));
return res;
}求得控制點矩陣之後使用b樣條曲線擬合函式可得到插值曲線圖。
/*b樣條曲線擬合
@return 返回擬合得到的曲線
@discretepoints 輸入的離散點,至少4個點
@closed 是否擬合閉合曲線,true表示閉合,false不閉合
@stride 擬合精度
*/vector
bsplinefit
(vector discretepoints,
bool closed,
double stride)
fittingpoints.
push_back
(totalpoints);}
}return fittingpoints;
}
效果如下圖所示:
b樣條和三次樣條 樣條曲線
最近在學習軌跡規劃中的軌跡生成,涉及到樣條曲線方面的知識,總結一下。曲線的平滑性和相應的平滑性的評判準則相關,在 1 中,作者採用曲率的平方和曲率導數的平方作為評判準則 其中 是路徑點的方向角。最小化這兩個準則的軌跡分別是圓弧和三階螺旋線,並對在對稱和不對稱情況下如何生成路徑進行了分析,事實表明三階...
三次樣條曲線
include include using namespace std const int m 16 double dknowx m double dknowy m double dknowdy m double dknowddy m const int n 15 double dinsertx n...
b樣條和三次樣條 B樣條 貝塞爾曲線和b樣條曲線
在數學的子學科數值分析裡,b 樣條是樣條曲線一種特殊的表示形式。它是b 樣條基曲線的線性組合。b 樣條是貝茲曲線的一種一般化,可以進一步推廣為非均勻有理b樣.b樣條就相當於乙個函式,這個函式在係數不同時就可以變化成各種曲線形狀.在實際生產中,我們測量得到的是乙個個離散的點,那麼我們要知道相鄰兩個點之...